PyQt5多页应用程序:将主类划分为几个文件?



我正在尝试使用PyQT5和python 3.8构建一个相当复杂的GUI应用程序,我被如何将代码划分为可管理的文件所困扰。我是GUI编程和面向对象编程的新手,并且尝试了在互联网上可以找到的几种解决方案,但我无法让它们为我工作。所以我很抱歉,如果这个问题已经被问过很多次了,但我想我需要一些专门针对我的项目的提示。

我还没有被允许发布图像,所以这里是一个链接如何应用程序看起来代替:应用程序GUI

我的应用程序有一个总是可见的侧边栏和一个堆叠的小部件,其中包含多个页面(在上面的链接中可见是14 WEL)。我有一个main.py文件,我想用它来设置ui并连接所有页面的按钮。然后,我希望有几个.py文件来处理用户输入和计算(每个页面一个文件)。我还有一个helper_functions.py文件,用于在多个页面上存储我需要的函数。到目前为止,工作的是将页面类(例如OutWelPageControl)导入到init中的MainWindow类中,但随后我似乎无法从OutWelPageControl中的getFile()中调用createPreview()(当我单击触发getFile()的按钮时,应用程序终止代码=1073741845)。如果不调用createPreview(self, welFiles_num),它确实可以工作。

main.py:

import sys
import os
from PyQt5 import QtWidgets as qtw
from PyQt5 import QtCore as qtc
from PyQt5 import QtGui as qtg
from helper_functions import *
# GUI FILE
from ui_main import Ui_MainWindow
class MainWindow(qtw.QMainWindow):
def __init__(self):
qtw.QMainWindow.__init__(self)
self.ui = Ui_MainWindow()
self.ui.setupUi(self)
## PAGE CONNECTION
########################################################################
self.ui.btn_out_wel.clicked.connect(lambda: self.ui.stackedWidget.setCurrentWidget(self.ui.page_out_wel))
#... (other pages)

# This is probably wrong
from out_wel import OutWelPageControl

## BUTTONS
# How I want it to work
self.ui.btn_file.clicked.connect(lambda: OutWelPageControl.getFile(self))
self.show()

if __name__ == "__main__":
app = qtw.QApplication(sys.argv)
window = MainWindow()
sys.exit(app.exec_())

helper_functions.py:

from main import *
class HelperFunctions(MainWindow):
def getFile(self):
fnames = qtw.QFileDialog.getOpenFileNames(self, 'WEL-Datei öffnen', 'C:\',"*.WEL")[0]
return (fnames)

out_wel.py页:

from main import *
from helper_functions import *
class OutWelPageControl(MainWindow):
def getFile(self):
welFiles = HelperFunctions.getFile(self)
# Label Input File
welFiles_string = []
for wel in welFiles:
welFiles_string.append(os.path.basename(wel))
welFiles_string2 = ', '.join(welFiles_string)
self.ui.lbl_filepath.setText(welFiles_string2)
welFiles_num = []
for wel in welFiles:
welFiles_num.append(os.path.splitext(os.path.basename(wel))[0])

# Call another function
createPreview(self, welFiles_num)

def createPreview(self, welFiles_num):
pass

所以我的问题基本上是我如何划分应用程序代码,使每个页面都有自己的。py文件,仍然可以改变ui的元素?页面文件是否必须包含主窗口的子类,或者是否有其他选项使其工作?

这里有相当多的代码没有一个特定的问题,但我可以试着给出一些一般性的建议,看看是否能以任何方式帮助你。

  1. 在helper_functions中,当你在main中导入helper_functions时,你不能使用from main import *,这会导致循环导入(它们相互反复导入)
  2. 同样在helper_functions中,如果您需要的只是在不同页面中可用的一些函数,则不需要是类。你可以把函数放在那里,然后用helper_functions.func_name(args)调用它们。
  3. from out_wel import OutWelPageControl应该在.py文件的顶部,而不是在主类
  4. 的init中。
  5. 对于导入和使用你的ui代码,使用双重继承,所以你不必到处使用self.ui:
class MainWindow(qtw.QMainWindow, Ui_MainWindow):
def __init__(self, *args, **kwargs):
super().__init__(self, *args, **kwargs)
self.setup_ui()
  1. 你不应该在你为不同页面构建的其他类中子类化你的主类。
  2. 我想看看这个关于如何使用堆叠小部件的页面。但是我相信你必须为不同的"页面"类子类化QWidget,这样它们就可以添加到堆叠的小部件中。
  3. 如果你正在制作类,你应该实例化对象,例如在main中你应该有self.out_wel_page = OutwelPageControl()
  4. 如果您需要在子部件的函数中使用父部件的某些功能,您可以将self从父部件传递给子部件

让我知道这里有什么帮助,找不到一个具体的东西来解决你遇到的问题,但想试着帮忙。

最新更新