我一直在尝试使用PyQt5库开发多窗口应用程序。我想要第二个专门用于单独功能的窗口。我能够从主窗口切换到辅助窗口而没有任何问题。但是,在尝试切换回去之后,出现了递归错误异常。这是相关的代码:
import os
import sys
from functools import partial
from PyQt5.QtGui import QIcon, QPixmap
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QMainWindow, QApplication, QFrame, QMessageBox, QMenu
class IpLogger(QMainWindow):
def __init__(self):
super(IpLogger, self).__init__()
self.setWindowTitle("Main window")
self.setFixedSize(648, 228)
self.setWindowIcon(QtGui.QIcon("data\\icon\\WiFicon.ico"))
self.loggerUI()
def loggerUI(self):
#Define font variable
font = QtGui.QFont()
#Button leading to second window
self.mediaBtn = QtWidgets.QPushButton(self)
self.mediaBtn.setGeometry(QtCore.QRect(10, 180, 181, 41))
font.setPointSize(10)
self.mediaBtn.setFont(font)
self.mediaBtn.setObjectName("mediaBtn")
self.mediaBtn.setText("Social Media")
self.mediaBtn.clicked.connect(partial(self.showWindow, Media()))
#Switching windows
def showWindow(self, window):
self.win = window
self.win.show()
self.close()
class Media(QMainWindow):
def __init__(self):
super(Media, self).__init__()
self.setWindowTitle("Second window")
self.setFixedSize(300, 180)
self.setWindowIcon(QtGui.QIcon("data\\icon\\WiFicon.ico"))
self.mediaUI()
def mediaUI(self):
#Variables
font = QtGui.QFont()
#Button leading back to the main menu
self.backBtn = QtWidgets.QPushButton(self)
self.backBtn.setGeometry(QtCore.QRect(130, 123, 40, 40))
font.setFamily("Segoe UI")
font.setPointSize(10)
self.backBtn.setFont(font)
self.backBtn.setObjectName("backBtn")
self.backBtn.setStyleSheet("background-color: rgb(69, 69, 69, 0)")
self.backBtn.setIcon(QtGui.QIcon("data\\icon\\back.png"))
self.backBtn.setIconSize(QtCore.QSize(40, 40))
self.backBtn.clicked.connect(partial(self.showWindow, IpLogger()))
#Switching windows
def showWindow(self, window):
self.win = window
self.win.show()
self.close()
def window():
app = QApplication(sys.argv)
win = IpLogger()
win.show()
sys.exit(app.exec_())
window()
根据您的代码创建一个IpLogger对象,此IpLogger对象在其loggerUI方法中创建,该方法在构建Media()对象时执行,该新对象在mediaUI()中执行相同的操作,即创建另一个IpLogger对象,也就是说,您要执行下一步:
IpLogger->loggerUI->Media->mediaUI->IpLogger->loggerUI->Media->...
根据OP帖子中的解释,您只想拥有一个IpLogger对象和一个Media对象,因此可以在window函数中创建这两个对象,并使用连接来交换一个或另一个的可见性。视情况而定。
import sys
from PyQt5 import QtCore, QtGui, QtWidgets
class IpLogger(QtWidgets.QMainWindow):
def __init__(self):
super(IpLogger, self).__init__()
self.setWindowTitle("Main window")
self.setFixedSize(648, 228)
self.setWindowIcon(QtGui.QIcon("data\\icon\\WiFicon.ico"))
self.loggerUI()
def loggerUI(self):
# Define font variable
font = QtGui.QFont()
# Button leading to second window
self.mediaBtn = QtWidgets.QPushButton(self)
self.mediaBtn.setGeometry(QtCore.QRect(10, 180, 181, 41))
font.setPointSize(10)
self.mediaBtn.setFont(font)
self.mediaBtn.setObjectName("mediaBtn")
self.mediaBtn.setText("Social Media")
class Media(QtWidgets.QMainWindow):
def __init__(self):
super(Media, self).__init__()
self.setWindowTitle("Second window")
self.setFixedSize(300, 180)
self.setWindowIcon(QtGui.QIcon("data\\icon\\WiFicon.ico"))
self.mediaUI()
def mediaUI(self):
# Variables
font = QtGui.QFont()
# Button leading back to the main menu
self.backBtn = QtWidgets.QPushButton(self)
self.backBtn.setGeometry(QtCore.QRect(130, 123, 40, 40))
font.setFamily("Segoe UI")
font.setPointSize(10)
self.backBtn.setFont(font)
self.backBtn.setObjectName("backBtn")
self.backBtn.setStyleSheet("background-color: rgb(69, 69, 69, 0)")
self.backBtn.setIcon(QtGui.QIcon("data\\icon\\back.png"))
self.backBtn.setIconSize(QtCore.QSize(40, 40))
def window():
app = QtWidgets.QApplication(sys.argv)
win = IpLogger()
media = Media()
win.mediaBtn.clicked.connect(media.show)
win.mediaBtn.clicked.connect(win.close)
media.backBtn.clicked.connect(win.show)
media.backBtn.clicked.connect(media.close)
win.show()
sys.exit(app.exec_())
if __name__ == "__main__":
window()