Python 在pyqt5中管理窗口的正确方法是什么?

Python 在pyqt5中管理窗口的正确方法是什么?,python,pyqt,pyqt5,python-3.6,qt-designer,Python,Pyqt,Pyqt5,Python 3.6,Qt Designer,在我正在构建的应用程序中,我有几个正在使用的“窗口”。根据python/行业标准,我试图找出如何正确管理它们。我有一个警告屏幕、免责声明屏幕、主gui,基本上还有一个用于传达错误的消息框 我的客户希望看到的是程序显示警告屏幕(QDialog),然后单击按钮显示免责声明屏幕(QDialog),然后在用户同意免责声明后显示主gui(QMainWindow)。消息框仅在需要提醒用户某些事件时使用注意:我正在使用qt设计工具 我试图以一种非常面向对象的方式来处理这个项目,但我正在努力以一种不会完全混乱的

在我正在构建的应用程序中,我有几个正在使用的“窗口”。根据python/行业标准,我试图找出如何正确管理它们。我有一个警告屏幕、免责声明屏幕、主gui,基本上还有一个用于传达错误的消息框

我的客户希望看到的是程序显示警告屏幕(QDialog),然后单击按钮显示免责声明屏幕(QDialog),然后在用户同意免责声明后显示主gui(QMainWindow)。消息框仅在需要提醒用户某些事件时使用注意:我正在使用qt设计工具

我试图以一种非常面向对象的方式来处理这个项目,但我正在努力以一种不会完全混乱的方式来实现它。我打算使用一个主类,在启动时初始化应用程序的所有部分,并使用两个控制器(一个用于gui,一个用于后端进程)

到目前为止,我的gui控制器故障严重。最初,我为每个窗口创建了一个类,然后尝试在gui控制器中为每个窗口创建对象。我被迫将所有类移动到一个文件中,删除gui控制器类代码,并将此文件用作应用程序的“主”文件,以便启动第一个窗口。我仍然无法在窗口之间切换,最多只能关闭当前打开的窗口在Python3/PyQt5中构造这样的应用程序的正确方法是什么?

一些代码:

#There used to be another class for gui_controller that instantiated all the below (pyqt5 doesn't work this way as I've come to learn)

#Used to be in its own file.
class WarningScreen(QDialog, Ui_SomeWarningScreen):

    def __init__(self, parent=None):
        super(WarningScreen, self).__init__(parent)
        self.setupUi(self)
        self.accept_button_2.clicked.connect(self.acknowledge_warning)

    def acknowledge_warning(self):
        window = Disclaimer()
        window.show()
        self.close()

#Used to be in its own file.
class DisclaimerScreen(QDialog, Ui_UsageDislaimer):

    def __init__(self, parent=None):
        super(DisclaimerScreen, self).__init__(parent)
        self.setupUi(self)

#This was initially in the main class for the application.
if __name__ == "__main__":

    APP = QApplication(sys.argv)

    WINDOW = WarningScreen()

    WINDOW.show()

    sys.exit(APP.exec_())

打开的窗口不是由一个简单的事实显示的,局部变量在其作用域完成时被删除,在您的情况下,
window=Disclaimer()
是一个将被删除的局部变量,因此可能的解决方案是:

def acknowledge_warning(self):
    self.window = Disclaimer()
    self.window.show()
    self.close()
尽管更好的选择是创建一个类或函数,其中实现了窗口之间交互的逻辑,但在下面的部分中,我将展示一个示例:

class WarningScreen(QtWidgets.QDialog, Ui_SomeWarningScreen):
    closed = QtCore.pyqtSignal()

    def __init__(self, parent=None):
        super(WarningScreen, self).__init__(parent)
        self.setupUi(self)
        self.accept_button_2.clicked.connect(self.close)
        self.accept_button_2.clicked.connect(self.closed)


class DisclaimerScreen(QtWidgets.QDialog, Ui_UsageDislaimer):
    def __init__(self, parent=None):
        super(DisclaimerScreen, self).__init__(parent)
        self.setupUi(self)


class Controller:
    def __init__(self):
        self.warning = WarningScreen()
        self.disclaimer = DisclaimerScreen()

        self.warning.closed.connect(self.disclaimer.show)
        self.warning.show()

if __name__ == "__main__":
    import sys

    APP = QtWidgets.QApplication(sys.argv)
    w = Controller()
    sys.exit(APP.exec_())

我甚至没有考虑变量范围。现在这真的很有道理。(这是你第二次帮助我eyllanesc:))。但奇怪的是,为了使应用程序的其余部分更清晰,是否可以将底部的代码移动到实际的“主类”中,而不干扰任何内容?如果可能的话,你能解释一下parent=None的用法吗?@BobFromBilling更好地解释你自己,你看不清楚的部分,你不喜欢以下内容:
self.warning.accept\u button\u 2.clicked.connect(self.disclaimer.show)
。另一方面,如果我的回答帮助你不要忘记将其标记为正确,如果你不知道怎么做,回顾一下,这是最好的感谢方式。不,我指的是if name==“main”:部分。是否需要保留在同一个文件中,或者我可以将其移动到另一个文件中?代码块的使用对我来说有点陌生,我理解这个概念,但我来自Java,使用的是literal main类。
parent=None
:在Qt中存在依赖关系,例如,属于Qt的对象的生命周期与普通python对象的生命周期不同,因此Qt有很多次消除孩子记忆的责任,因此关系允许Qt轻松,记住PyQt有一个强大的C++组件,因此它符合C++规则,例如,通过析构函数进行的直接内存管理,python通常会对其进行管理,而不会给开发人员提供这种可能性。@BobFromBilling在java中,有一个main类必须具有方法public static void main(…),称为main function,这相当于
如果_uname_uu==“uuu main uu”:
,在python中,您可以在所有的.py中使用这些函数,并且多次使用它来测试组件,但是只有当启动的文件的uuuu name uuuu==“uuuu main”:时,其他函数将被忽略。Python不是Java,Python不符合Java规则,我认为您希望有一个main.py文件,其中只存在该函数:对吗?