PyQt5:RecursionError:调用Python对象时超出最大递归深度

问题描述 投票:0回答:1

我一直在尝试使用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()
python pyqt pyqt5
1个回答
1
投票

说明:

根据您的代码创建一个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()
© www.soinside.com 2019 - 2024. All rights reserved.