PyQt5:切换到新时使用 DeleteOnClose window

PyQt5: Using DeleteOnClose when switching to new window

我目前正在 Python 3.7 中创建一个 GUI,在 Spyder 环境中使用 PyQt5 和 Qt Designer。 GUI 有许多不同的 windows。基本上我从 UI_Start window 开始,然后在按下按钮时打开下一个 window。 GUI 工作正常,但是在大约 50 windows 之后,程序突然不再显示下一个 window,但也不会停止执行。这个问题的奇怪之处在于:

  1. 完全相同的 window class 之前已经调用了很多次,从来没有出现过任何问题
  2. 这个问题不仅发生在一个 window 上,它也可能发生在另一个 window class 上(但在显示相同数量的 windows 之后)

我试图弄清楚为什么 .show() 命令突然不再起作用了。我使用 print 语句来查看程序“崩溃”的位置。我看到即使是 .show() 命令之后的打印语句也能正常工作,但是由于 window 没有显示,我无法按任何按钮来触发下一个事件。所以基本上程序挂了。

我对 Python 中的编程和创建 GUI 比较陌生,但我认为问题可能是由于内存泄漏引起的。这就是为什么我现在尝试在使用 self.setAttribute(QtCore.Qt.WA_DeleteOnClose, True) 关闭 window 时打开内存 space。但是,现在我面临着下一个 window 不再出现的问题。那么,如果我想在之后显示一个新的 window,我该如何使用 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_())

一开始我猜是垃圾回收的问题。对您的新 window 的唯一引用存储在您之前的 window 中。已删除,因此不再引用您的 window 对象,python 可能会自动删除它。

在这些情况下,我经常使用全局变量来存储当前 windows 引用。