在我正在构建的应用程序中,我有一些正在使用的“窗口”。我试图根据python /行业标准找出如何正确管理它们的方法。我有一个警告屏幕,免责声明屏幕,主gui和本质上是一个用于传达错误的消息框。
我的客户希望使用的程序是显示警告屏幕(QDialog),然后单击按钮时显示免责声明屏幕(QDialog),然后在用户同意免责声明后显示主GUI(QMainWindow)。该消息框仅在需要向用户发出某些事件的警报时使用。 注意:我正在使用qt desinger
我正在尝试以一种非常面向对象的方式来处理这个项目,但是我正在努力以一种并非完全混乱的方式来实现它。我打算做的是有一个主类,该主类在启动时初始化应用程序的所有部分,其中包含两个控制器(一个用于gui,一个用于后端进程)。
到目前为止,我的gui控制器严重失败。最初,我为每个窗口创建一个类,然后尝试在gui控制器中为每个窗口创建对象。我被迫将所有类移动到一个文件中,删除gui控制器类代码,并将此文件用作应用程序的“主要”文件,甚至获得第一个启动窗口。我仍然无法在Windows之间切换,充其量我只能关闭当前打开的窗口。 在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_())
答案 0 :(得分:0)
打开的窗口没有一个简单的事实显示,局部变量在其作用域完成时将被删除,在您的情况下,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_())