【问题标题】:PyQt close child window problem, infinite loop?PyQt关闭子窗口问题,无限循环?
【发布时间】:2019-04-05 05:41:37
【问题描述】:

在编写一些代码时,我偶然发现了一个我无法解决的问题。我已经剥离了代码以仅显示问题。我试过使用 MainWindow.close() 但它关闭了第一个窗口。 控制台错误是:

self.close()
  [Previous line repeated 993 more times]
RecursionError: maximum recursion depth exceeded
import sys
from PyQt5 import QtWidgets, QtGui, QtCore

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.pushButton = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton.setObjectName("pushButton")
        self.pushButton.setText("Open new window")
        self.pushButton.clicked.connect(self.open)

    def open(self):
        self.window = QtWidgets.QMainWindow()
        self.ui = Ui_SecondWindow()
        self.ui.setupUi(self.window)
        self.window.show()

class Ui_SecondWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.pushButton = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton.setObjectName("pushButton")
        self.pushButton.setText("Close new window")
        self.pushButton.clicked.connect(self.close)

    def close(self):
        self.close()   

if __name__ == "__main__": 
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())

【问题讨论】:

    标签: python pyqt


    【解决方案1】:

    下一部分指向这个的错误:

    def close(self):
        self.close()   
    

    由于调用 self.close(),您正在调用调用返回的 self.close() 的类的 close() 方法,并且如您所见,它会生成一个无限循环。

    另外一个错误是PyQt不建议修改pyuic生成的代码,建议再创建一个继承自相应窗口的类,并使用pyuic生成的类作为接口。

    考虑到上一部分的说明,解决方法是:

    import sys
    from PyQt5 import QtWidgets, QtGui, QtCore
    
    class Ui_MainWindow(object):
        def setupUi(self, MainWindow):
            MainWindow.setObjectName("MainWindow")
            self.centralwidget = QtWidgets.QWidget(MainWindow)
            self.centralwidget.setObjectName("centralwidget")
            self.pushButton = QtWidgets.QPushButton(self.centralwidget)
            self.pushButton.setObjectName("pushButton")
            self.pushButton.setText("Open new window")
    
    class Ui_SecondWindow(object):
        def setupUi(self, MainWindow):
            MainWindow.setObjectName("MainWindow")
            self.centralwidget = QtWidgets.QWidget(MainWindow)
            self.centralwidget.setObjectName("centralwidget")
            self.pushButton = QtWidgets.QPushButton(self.centralwidget)
            self.pushButton.setObjectName("pushButton")
            self.pushButton.setText("Close new window")
    
    class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
        def __init__(self, parent=None):
            super(MainWindow, self).__init__(parent)
            self.setupUi(self)
            self.pushButton.clicked.connect(self.open)
    
        @QtCore.pyqtSlot()
        def open(self):
            self.window = SecondWindow()
            self.window.show()
    
    class SecondWindow(QtWidgets.QMainWindow, Ui_SecondWindow):
        def __init__(self, parent=None):
            super(SecondWindow, self).__init__(parent)
            self.setupUi(self)
            self.pushButton.clicked.connect(self.close)
    
    if __name__ == "__main__": 
        app = QtWidgets.QApplication(sys.argv)
        w = MainWindow()
        w.show()
        sys.exit(app.exec_())
    

    【讨论】:

      【解决方案2】:

      说实话:

      import sys
      from PyQt5 import QtWidgets, QtGui, QtCore
      
      class Ui_MainWindow(object):
          def setupUi(self, MainWindow):
              MainWindow.setObjectName("MainWindow")
              self.centralwidget = QtWidgets.QWidget(MainWindow)
              self.centralwidget.setObjectName("centralwidget")
              self.pushButton = QtWidgets.QPushButton(self.centralwidget)
              self.pushButton.setObjectName("pushButton")
              self.pushButton.setText("Open new window")
              self.pushButton.clicked.connect(self.open)
      
          def open(self):
              self.window = QtWidgets.QMainWindow()
              self.ui = Ui_SecondWindow()
              self.ui.setupUi(self.window)
              self.window.show()
      
      
      
      class Ui_SecondWindow(object):
          def setupUi(self, MainWindow):
              MainWindow.setObjectName("MainWindow")
              self.centralwidget = QtWidgets.QWidget(MainWindow)
              self.centralwidget.setObjectName("centralwidget")
              self.pushButton = QtWidgets.QPushButton(self.centralwidget)
              self.pushButton.setObjectName("pushButton")
              self.pushButton.setText("Close new window")
              self.pushButton.clicked.connect(MainWindow.close)     # - self.close
      
      #    def close(self):
      #        self.close()   
      
      if __name__ == "__main__": 
          app = QtWidgets.QApplication(sys.argv)
          MainWindow = QtWidgets.QMainWindow()
          ui = Ui_MainWindow()
          ui.setupUi(MainWindow)
          MainWindow.show()
          sys.exit(app.exec_())
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-05-26
        • 2014-01-28
        • 1970-01-01
        • 1970-01-01
        • 2021-12-25
        • 1970-01-01
        相关资源
        最近更新 更多