По мере роста приложения PyQt класс mainwindow становится очень тесным, и приложение удобно разбивать на модули. В некоторых случаях различия в отношении того, что может быть помещено в модуль, очевидны, например, файл конфигурации, который загружается в класс основного окна, или набор методов, которые принимают числовые входные данные и дают числовые выходные данные. Однако я не уверен насчет промежуточной области, например, когда вычисления выполняются для переменных, и они используются для генерации / обновления виджетов, например, в следующем примере игрушки, где некоторые вычисления выполняются для переменных mainwindow / config, и они используются для генерации / обновить виджет (в моем проекте это, скорее всего, объекты заговора).
Это работает нормально, как есть, но по мере роста моего класса главного окна я начал размещать такие функции, как plot_computation, в модулях. связанные с работой, которую они выполняют. Определив функцию в отдельном модуле, есть две опции: передать каждую отдельную переменную, необходимую методу, или передать ссылку на все основное окно, т.е. «module.plot_computation (self)». Я обратился к последнему, так как он кажется более аккуратным, когда есть много аргументов (4-5).
Мне было интересно, как другие структурируют свои приложения на высоком уровне, и каковы лучшие практики, и если Подход, который я выбрал, является разумным или может быть оптимизирован.
from PyQt5 import QtWidgets, QtGui
class UiMainWindow(QtWidgets.QMainWindow):
def __init__(self):
super(UiMainWindow, self).__init__()
# init variables
self.x = 1
self.y = 2
self.data = None
self.lineedit = None
# set mainwindow + widgets
self.mainwidget = QtWidgets.QWidget(self)
self.mainwidget_gridlayout = QtWidgets.QGridLayout(self.mainwidget)
self.setCentralWidget(QtWidgets.QWidget(self))
self.centralWidget().setLayout(self.mainwidget_gridlayout)
self.button = QtWidgets.QPushButton(self)
self.mainwidget_gridlayout.addWidget(self.button)
self.button.pressed.connect(self.plot_computation)
def plot_computation(self): # I have begun to move such methods into their own module
self.data = self.do_computation(self.x, self.y)
self.lineedit = QtWidgets.QLineEdit(self)
self.mainwidget_gridlayout.addWidget(self.lineedit)
self.lineedit.setText(str(self.data))
def do_computation(self, x, y): # this method would already be in a seperate module
result = x + y
return result
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
mw = UiMainWindow()
mw.show()
sys.exit(app.exec_())