PyQt5: RecursionError: максимальная глубина рекурсии превышена при вызове объекта Python - PullRequest
2 голосов
/ 29 января 2020

Я пытался разработать многооконное приложение, используя библиотеку PyQt5. Я хотел иметь второе окно, предназначенное для отдельных функций. Мне удалось без проблем переключиться с главного окна на дополнительное. Однако после попытки вернуться назад я получил исключение Recursion Error. Вот соответствующий код:

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

1 Ответ

2 голосов
/ 29 января 2020

Объяснение:

В соответствии с вашим кодом вы создаете объект 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...