【问题标题】:Window closes immediatelly after run运行后立即关闭窗口
【发布时间】:2021-02-24 00:24:02
【问题描述】:

我的代码用一个按钮调用一个窗口。单击按钮时,调用另一个窗口。但第二个窗口立即关闭

“basic”和“windows_two”是pyuic5从.ui文件中生成的.py库

import basic, windows_two
from PyQt5 import QtCore, QtGui, QtWidgets

if __name__ == "__main__":
    
    #Declarations
    import sys
    app = QtWidgets.QApplication(sys.argv)
    
    def Call_Second_Window():
        #Second Screen
        Form = QtWidgets.QWidget()
        ui = windows_two.Ui_Form()
        ui.setupUi(Form)
        Form.show()
        
    def Call_Main_Window():
        #MainWindow
        MainWindow = QtWidgets.QMainWindow()
        ui = basic.Ui_MainWindow()
        ui.setupUi(MainWindow)      
        ui.printButton.clicked.connect(Call_Second_Window) #click event to second window
        MainWindow.show()
        sys.exit(app.exec_())
        
    
    Call_Main_Window()
    

怎么了?

谢谢

【问题讨论】:

    标签: python pyqt5 qt-designer pyuic


    【解决方案1】:

    每当一个变量是本地时,只要函数返回,它就会被“垃圾收集”;这意味着变量可能引用的所有内容也将(可能)被删除。

    在您的情况下发生的情况是,在正确创建窗口时,当Call_Second_Window 返回时(就在Form.show() 之后),它将立即被删除(由于垃圾收集)。

    为避免只有一种解决方案:使对对象的引用持久化。有多种方法可以实现这一点,具体取决于具体情况。

    不幸的是,您的代码有点不正统(尤其是从 PyQt 的角度来看),所以我正在“重构”它,以使其更标准化、更好地面向对象,而且更重要的是,更易于阅读。

    import basic, windows_two
    from PyQt5 import QtWidgets
    
    class MainWindow(QtWidgets.QMainWindow):
        def __init__(self):
            super().__init__()
            self.ui = basic.Ui_MainWindow()
            self.ui.setupUi(self)
            self.ui.printButton.clicked.connect(self.call_Second_Window) 
    
            self.secondWindow = None
    
        def call_Second_Window(self):
            if not self.secondWindow:
                self.secondWindow = SecondWindow()
            self.secondWindow.show()
    
    
    class SecondWindow(QtWidgets.QWidget):
        def __init__(self):
            super().__init__()
            self.ui = windows_two.Ui_Form()
            self.ui.setupUi(self)
    
    
    if __name__ == "__main__":
        import sys
        app = QtWidgets.QApplication(sys.argv)
        
        mainWindow = MainWindow()
        mainWindow.show()
    
        sys.exit(app.exec_())
    

    注意:如您所见,我将call_Second_Window 的名称更改为小写的“c”,这是因为大写名称只能用于类和常量,而函数名称应始终以a开头小写。这又是为了可读性,这在编程中非常重要,也是 python 的核心原则之一。在官方Style Guide for Python Code 上阅读有关此主题和其他重要主题的更多信息。

    【讨论】:

    • 这样就解决了问题。我从python开始,有时会犯一些错误……我会研究这段代码。非常感谢!!!
    猜你喜欢
    • 1970-01-01
    • 2021-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多