首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >python多个对话框中超过了最大递归深度

python多个对话框中超过了最大递归深度
EN

Stack Overflow用户
提问于 2018-07-15 20:56:40
回答 3查看 232关注 0票数 -1
代码语言:javascript
复制
# -*- coding: utf-8 -*-
import sys
from PyQt4 import QtGui, QtCore

class Window_Test3(QtGui.QDialog):

    def __init__(self, parent=None):
        QtGui.QWidget.__init__(self, parent)
        global progress_flag
        **self.Next_Window = Window_Test1()   # Return Window_Test1() but RuntimeError: maximum recursion depth exceeded**

  self.setWindowFlags(QtCore.Qt.CustomizeWindowHint|QtCore.Qt.WindowTitleHint|QtCore.Qt.WindowMaximizeButtonHint)
        self.setGeometry(0, 0, 800,480)
        self.setWindowTitle('TEST PROCESSING')

        quit = QtGui.QPushButton('Close', self)

        quit.setGeometry(10, 10, 60, 35)

        test = QtGui.QPushButton('TEST 3', self)
        test.setGeometry(100, 200, 200, 100)


        self.connect(quit, QtCore.SIGNAL('clicked()'),self.reject)
        self.connect(test, QtCore.SIGNAL('clicked()'), self.nextWindow)

    def nextWindow(self):

        self.Next_Window.show()

class Window_Test2(QtGui.QDialog):
    def __init__(self):
        QtGui.QWidget.__init__(self)
        global progress_flag
        self.Window3 = Window_Test3()

        self.setWindowFlags(QtCore.Qt.CustomizeWindowHint|QtCore.Qt.WindowTitleHint|QtCore.Qt.WindowMaximizeButtonHint)
        self.setGeometry(0, 0, 800, 480)
        self.setWindowTitle('TEST PROCESSING')

        self.quit = QtGui.QPushButton('Close', self)
        self.quit.setGeometry(10, 10, 60, 35)

        test = QtGui.QPushButton('TEST 2', self)
        test.setGeometry(250, 220, 200, 100)

        self.connect(self.quit, QtCore.SIGNAL('clicked()'),self.reject)

        self.connect(test, QtCore.SIGNAL('clicked()'),self.nextWindow)

    def nextWindow(self):

        self.Window3.show()

class Window_Test1(QtGui.QDialog):

    def __init__(self):
        QtGui.QWidget.__init__(self)

        self.Window2 = Window_Test2()

        self.setGeometry(0, 0, 800, 480)
        self.setWindowTitle('TEST PROCESSING' )

        test = QtGui.QPushButton('TEST', self)
        test.setGeometry(100,100,100,100)

        quit = QtGui.QPushButton('Close', self)
        quit.setGeometry(10, 10, 60, 35)

        self.connect(test, QtCore.SIGNAL('clicked()'),self.nextWindow)

        self.connect(quit, QtCore.SIGNAL('clicked()'), self.reject)

    def nextWindow(self):
        self.Window2.show()

if __name__ == '__main__':

    app = QtGui.QApplication(sys.argv)
    Window1 = Window_Test1()
    Window1.show()
    sys.exit(app.exec_())
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-07-16 00:40:35

为下一个窗口创建一个占位符self.next_Window,并在创建所有3个窗口后填充它

代码语言:javascript
复制
# -*- coding: utf-8 -*-
import sys
from PyQt4 import QtGui, QtCore

class Window_Test3(QtGui.QDialog):

    def __init__(self, parent=None):
        QtGui.QWidget.__init__(self, parent)
        global progress_flag
        self.next_Window = None

        self.setWindowFlags(QtCore.Qt.CustomizeWindowHint|
                            QtCore.Qt.WindowTitleHint|
                            QtCore.Qt.WindowMaximizeButtonHint)
        self.setGeometry(0, 0, 800,480)
        self.setWindowTitle('TEST PROCESSING')

        quit = QtGui.QPushButton('Close', self)

        quit.setGeometry(10, 10, 60, 35)

        test = QtGui.QPushButton('TEST 3', self)
        test.setGeometry(100, 200, 200, 100)


        self.connect(quit, QtCore.SIGNAL('clicked()'),self.reject)
        self.connect(test, QtCore.SIGNAL('clicked()'), self.nextWindow)

    def nextWindow(self):
        self.next_Window.show()
    def setNextWindow(self, nextWindow):
        self.next_Window = nextWindow

class Window_Test2(QtGui.QDialog):
    def __init__(self):
        QtGui.QWidget.__init__(self)
        global progress_flag
        self.next_Window = None

        self.setWindowFlags(QtCore.Qt.CustomizeWindowHint|
                            QtCore.Qt.WindowTitleHint|
                            QtCore.Qt.WindowMaximizeButtonHint)
        self.setGeometry(0, 0, 800, 480)
        self.setWindowTitle('TEST PROCESSING')

        self.quit = QtGui.QPushButton('Close', self)
        self.quit.setGeometry(10, 10, 60, 35)

        test = QtGui.QPushButton('TEST 2', self)
        test.setGeometry(250, 220, 200, 100)

        self.connect(self.quit, QtCore.SIGNAL('clicked()'),self.reject)

        self.connect(test, QtCore.SIGNAL('clicked()'),self.nextWindow)

    def nextWindow(self):
        self.next_Window.show()
    def setNextWindow(self, nextWindow):
        self.next_Window = nextWindow

class Window_Test1(QtGui.QDialog):

    def __init__(self):
        QtGui.QWidget.__init__(self)
        self.next_Window = None

        self.setGeometry(0, 0, 800, 480)
        self.setWindowTitle('TEST PROCESSING' )

        test = QtGui.QPushButton('TEST', self)
        test.setGeometry(100,100,100,100)

        quit = QtGui.QPushButton('Close', self)
        quit.setGeometry(10, 10, 60, 35)

        self.connect(test, QtCore.SIGNAL('clicked()'),self.nextWindow)
        self.connect(quit, QtCore.SIGNAL('clicked()'), self.reject)

    def nextWindow(self):
        self.next_Window.show()
    def setNextWindow(self, nextWindow):
        self.next_Window = nextWindow

if __name__ == '__main__':

    app = QtGui.QApplication(sys.argv)
    Window1 = Window_Test1()
    Window2 = Window_Test2()
    Window3 = Window_Test3()
    Window1.setNextWindow(Window2)
    Window2.setNextWindow(Window3)
    Window3.setNextWindow(Window1)
    Window1.show()
    sys.exit(app.exec_())
票数 0
EN

Stack Overflow用户

发布于 2018-07-16 00:17:38

您的代码递归地初始化新对象。

Window_Test1调用Window_Test2,后者调用Window_Test3,后者调用Window_Test1,后者调用Window_Test2,后者调用Window_Test3,后者调用Window_Test1,后者...你说对了。

您可能希望将这些对象的初始化推迟到实际需要它们的时候(因此不是在__init__中),或者可能需要引用所有三个窗口的单个实例。

票数 1
EN

Stack Overflow用户

发布于 2018-07-16 20:40:58

应该只有一个窗口,而不是三个。

代码语言:javascript
复制
def nextWindow (self):
    self.next_Window.show()
    self.actionEvent (self.reject ()) # Delete current screen

def setNextWindow (self, nextWindow):
    self.next_Window = nextWindow

也就是说,你加上self.actionEvent(self.reject ())

输出一个屏幕。

但是,切换屏幕时会有轻微的抖动。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51348599

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档