Высокоуровневая структура приложений PyQt - разбиение на модули и передача переменных - PullRequest
0 голосов
/ 20 апреля 2020

По мере роста приложения 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_())
...