Window 在 运行 之后立即关闭
Window closes immediatelly after run
我的代码用一个按钮调用一个 window。单击按钮时,调用另一个 window。但是第二个 window 立即关闭
“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()
怎么了?
谢谢
只要一个变量是 local 它就会在函数 returns 时得到“垃圾收集”;这意味着变量可能引用的所有内容也将(可能)删除。
你的情况是,虽然正确创建了 windows,但当 Call_Second_Window
returns(只是在 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.
上阅读有关此主题和其他重要主题的更多信息
我的代码用一个按钮调用一个 window。单击按钮时,调用另一个 window。但是第二个 window 立即关闭
“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()
怎么了?
谢谢
只要一个变量是 local 它就会在函数 returns 时得到“垃圾收集”;这意味着变量可能引用的所有内容也将(可能)删除。
你的情况是,虽然正确创建了 windows,但当 Call_Second_Window
returns(只是在 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.