【问题标题】:PyQt5: RecursionError: maximum recursion depth exceeded while calling a Python objectPyQt5:RecursionError:调用 Python 对象时超出最大递归深度
【发布时间】:2020-01-29 04:31:10
【问题描述】:

我一直在尝试使用 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】:

说明:

根据您的代码,您创建了一个 IpLogger 对象,此 IpLogger 对象在其 loggerUI 方法中创建,该方法在构建 Media() 对象时执行,该新对象在 mediaUI() 中执行相同操作,即创建另一个ipLogger 对象,也就是你接下来做什么:

IpLogger->loggerUI->Media->mediaUI->IpLogger->loggerUI->Media->...

解决办法:

根据 OP 帖子中的解释,您只想拥有一个 IpLogger 对象和一个 Media 对象,因此可以在窗口函数中创建这两个对象并使用连接来交换一个或其他视情况而定。

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()

【讨论】:

  • 非常感谢!现在您已经指出了这一点,这似乎很明显,但如果没有您的帮助,我需要很长时间才能解决这个问题。
猜你喜欢
  • 1970-01-01
  • 2017-11-07
  • 2021-01-10
  • 1970-01-01
  • 1970-01-01
  • 2020-06-25
  • 2020-01-05
  • 1970-01-01
  • 2020-07-13
相关资源
最近更新 更多