在编写一些代码时,我偶然发现了一个我无法解决的问题。我已经删除了代码以仅显示问题。我尝试过使用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_())
在下一部分中指出的错误:
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_())
真的:
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_())