窗口在运行后立即关闭

时间:2020-11-12 01:03:16

标签: python pyqt5 qt-designer pyuic

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

“基本”和“ 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()
    

怎么了?

谢谢

1 个答案:

答案 0 :(得分:1)

只要变量是 local ,函数返回时,它就会立即“收集垃圾”;这意味着该变量可能引用的所有内容也将(可能)也删除。

您遇到的情况是,正确创建了窗口后,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”,这是因为大写的名称仅应用于类和常量,而函数名称应始终以开头小写。再次出于可读性考虑,这在编程和python的核心原理之一中非常重要。在官方Style Guide for Python Code上了解有关此主题和其他重要主题的更多信息。