Python(tkinter):无法在实例之间传递变量

Python(tkinter):无法在实例之间传递变量,python,python-2.7,class,oop,tkinter,Python,Python 2.7,Class,Oop,Tkinter,我正在使用tkinter为我用Python2.7编写的程序创建UI。我修改了我在这里找到的代码: 我在跨实例传递变量时遇到问题。当我将page1参数添加到类page2中的\uuuu init\uuuu方法时,返回以下错误消息: 回溯(最近一次呼叫最后一次): 文件“question.py”,第77行,在(模块)中 app=Setup() 文件“question.py”,第16行,在uinit中_ 帧=F(父级=容器,控制器=自身) TypeError:init uz()正好接受4个参数(给定3个

我正在使用tkinter为我用Python2.7编写的程序创建UI。我修改了我在这里找到的代码:

我在跨实例传递变量时遇到问题。当我将
page1
参数添加到类
page2
中的
\uuuu init\uuuu
方法时,返回以下错误消息:

回溯(最近一次呼叫最后一次):

文件“question.py”,第77行,在(模块)中

app=Setup()

文件“question.py”,第16行,在uinit中_

帧=F(父级=容器,控制器=自身)

TypeError:init uz()正好接受4个参数(给定3个)

下面是我的代码的简化版本:

import Tkinter as tk

class Setup(tk.Tk):

    def __init__(self, *args, **kwargs):
        tk.Tk.__init__(self, *args, **kwargs)

        container = tk.Frame(self)
        container.pack(side="top", fill="both", expand=True)
        container.grid_rowconfigure(0, weight=1)
        container.grid_columnconfigure(0, weight=1)

        self.frames = {}
        for F in (page1, page2):
            page_name = F.__name__
            frame = F(parent=container, controller=self)
            self.frames[page_name] = frame
            frame.grid(row=0, column=0, sticky="nsew")

        self.show_frame("page1")

    def show_frame(self, page_name):
        frame = self.frames[page_name]
        frame.tkraise()

class page1(tk.Frame):

    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)
        self.controller = controller

        tk.Label(self, text="Number of children:").grid(row=2, sticky=tk.E)
        self.ChildrenNo = tk.Entry(self)
        self.ChildrenNo.grid(row=2, column=1)

        Quit = tk.Button(self, text="Exit", command= self.quit)
        Quit.grid(row=13, column=0, sticky="sw")
        Next = tk.Button(self, text="OK",
                         command=lambda: controller.show_frame("page2"))
        Next.grid(row=13, column=1, sticky=tk.SE)
        Apply = tk.Button(self, text="Apply", command = self.varset1)
        Apply.grid(row=13, column=1, sticky=tk.SW)

        self.childno = 0
        self.rowno = 0

    def varset1(self):
        self.childrenno = self.ChildrenNo.get()

class page2(tk.Frame):

    def __init__(self, parent, controller, page1):
        tk.Frame.__init__(self, parent)
        self.controller = controller
        self.childrenno = page1.childrenno

        for i in range(self.childrenno):
            self.childno = self.childno + 1
            self.rowno = self.rowno + 1
            tk.Label(self, text="Age of child %r:" % (self.childno)).grid(row=2, sticky=tk.E)
            self.ChildrenNo = tk.Entry(self)
            self.ChildrenNo.grid(row=self.rowno, column=1)

        Quit = tk.Button(self, text="Exit", command= self.quit)
        Quit.grid(row=13, column=0, sticky="sw")
        Back = tk.Button(self, text="Back",
                         command=lambda: controller.show_frame("page1"))
        Back.grid(row=13, column=1, sticky=tk.SE)
        Apply = tk.Button(self, text="Apply", command = self.varset2)
        Apply.grid(row=13, column=1, sticky=tk.SW)

    def varset2(self):
        houseno = self.HouseNo.get()
        postcode = self.PostCode.get()

if __name__ == "__main__":
    app = Setup()
    app.mainloop()

我哪里会出错?提前感谢您的帮助。

控制器的全部目的是让每个页面都不必知道其他页面。有关如何实现
get_page
方法的示例,请参见此答案:这不是您使用tkinter的方式…@abccd:这意味着什么?这是一种完全可以接受的使用tkinter的方式,尽管我不喜欢有人在初学者教程中使用该模式而没有正确解释它,所以现在很多人只是在不理解的情况下复制该模式。有关此特定模式来源的更多信息,请从这里开始:。@BryanOakley谢谢您的指点。我计划花时间对代码的工作原理有更深入的了解,希望能让事情变得更清楚。