我目前正在Python 3.7中创建一个GUI,在Spyder环境中使用PyQt5和Qt Designer。GUI有许多不同的窗口。基本上,我从UI_Start窗口开始,然后在按下按钮时打开下一个窗口。GUI运行得很好,但在大约50个窗口之后,程序突然不再显示下一个窗口,但也不会停止执行。这个问题的奇怪之处在于:
- 完全相同的窗口类事先已经被调用了很多次,从来没有出现过任何问题
- 该问题不仅发生在一个窗口中,也可能发生在另一个窗口类中(但在显示相同数量的窗口之后(
我试图弄清楚.show((命令突然不起作用的原因。我使用打印语句来查看程序";故障";。我看到即使是.show((命令之后的print语句也在工作,但由于窗口没有显示,我无法按下任何按钮来触发下一个事件。所以基本上程序是挂起的。
我对Python编程和创建GUI相对陌生,但我认为问题可能是由于内存泄漏造成的。这就是为什么我现在试图在关闭窗口时使用self.setAttribute(QtCore.Qt.WA_DeleteClose,True(打开内存空间。然而,现在我面临着下一个窗口不再出现的问题。那么,如果我想在之后显示一个新窗口,我如何使用DeleteOnClose?
如果有人对原来的问题有什么建议,请告诉我。大约一周以来,我一直在努力解决这个问题,但没有进一步解决。
已经谢谢你了!
我要使用的代码的某些部分:
class UI_Start(QtWidgets.QMainWindow):
def __init__(self):
super(UI_Start, self).__init__() # Call the inherited classes __init__ method
uic.loadUi('Screen_Start.ui', self) # Load the .ui file
self.setAttribute(QtCore.Qt.WA_DeleteOnClose, True) # added newly
self.Start_pushButton_Start.clicked.connect(self.openKommiScreen)
def openKommiScreen(self):
self.close()
self.KommiScreen = UI_Kommi(self)
class UI_Kommi(QtWidgets.QMainWindow):
def __init__(self, parent = None):
super(UI_Kommi, self).__init__(parent)
uic.loadUi('Screen_Kommi.ui', self)
self.setAttribute(QtCore.Qt.WA_DeleteOnClose, True)
global sheetNo
sheetNo = 1
self.WeiterButton = self.findChild(QtWidgets.QPushButton,'pushButton_Weiter')
self.WeiterButton.clicked.connect(self.openScanScreen)
self.show()
def openScanScreen(self):
self.close()
self.ScanScreen = UI_Scan(self)
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
window = UI_Start()
window.show()
sys.exit(app.exec_())
一开始我想这是一个垃圾收集问题。对新窗口的唯一引用存储在上一个窗口中。哪个被删除了,所以不再引用你的窗口对象,python可能会自动删除它。
在这些情况下,我经常使用全局变量来存储当前的窗口引用。