将变量传递给python / pyqt中的类的正确方法是什么?

问题描述 投票:0回答:1

想象一下,我有GUI类,其主要功能是处理程序的图形表示,但也存储信息和链接不同的操作。例如,像这样的事情:

import sys
from PyQt5.QtWidgets import QWidget, QPushButton, QGridLayout, QApplication

class MainWindow(QWidget):
    def __init__(self):
        super().__init__()
        self.button_a = QPushButton('button_a')
        self.button_b = QPushButton('button_b')
        self.button_c = QPushButton('button_c')
        self.layout = QGridLayout()
        self.layout.addWidget(self.button_a, 0, 0)
        self.layout.addWidget(self.button_b, 1, 0)
        self.layout.addWidget(self.button_c, 2, 0)
        self.setLayout(self.layout)

        self.variable_a = 1
        self.variable_b = 2
        self.variable_c = 3
        self.object_a = None
        self.object_b = None
        self.object_c = None

        self.button_a.clicked.connect(self.do_something)
        self.button_b.clicked.connect(self.do_something_else)
        self.button_c.clicked.connect(self.do_something_entirely_different)

    def do_something(self):
        self.object_a = ObjectClassA(self)

    def do_something_else(self):
        self.object_b = ObjectClassB(
            self.variable_a, self.variable_b, self.variable_c
        )

    def do_something_entirely_different(self):
        self.object_c = ObjectClassC()


class ObjectClassA:
    def __init__(self, gui):
        self.variable_a = gui.variable_a
        self.variable_b = gui.variable_b
        self.variable_c = gui.variable_c


class ObjectClassB:
    def __init__(self, variable_a, variable_b, variable_c):
        self.variable_a = variable_a
        self.variable_b = variable_b
        self.variable_c = variable_c


class ObjectClassC:
    def __init__(self):
        self.variable_a = GUI.variable_a
        self.variable_b = GUI.variable_b
        self.variable_c = GUI.variable_c


if __name__ == '__main__':
    app = QApplication(sys.argv)
    GUI = MainWindow()
    GUI.show()
    sys.exit(app.exec_())

这是哪种方法?我看到如果你传递整个MainWindow类,ObjectClassA的新实例基本上可以访问存储在MainWindow中的所有信息。但另一方面,如果我只是单独传递每个变量,我最终可能会传递一长串看起来很麻烦的东西。或者只是简单地引用MainWindow的实例?

我已经找到了this similar question,虽然我不太确定答案如何适用于我的问题。

python class pyqt
1个回答
2
投票

第二种方式ObjectClassB更好,因为它尊重对象封装。为了减少参数的数量,您可以使用dictionaries,就像这个例子一样。

def do_something_else(self):
    args = {'a':self.variable_a, 'b':self.variable_b, 'c':self.variable_c}
    self.object_b = ObjectClassB(args)


class ObjectClassB:
    def __init__(self, mydict):
        self.variable_a = mydict['a']
        self.variable_b = mydict['b']
        self.variable_c = mydict['c']
© www.soinside.com 2019 - 2024. All rights reserved.