Tkinter - 在不同的类中设置共享变量和访问

时间:2018-03-07 18:22:25

标签: python python-3.x tkinter

我按照这篇文章Switch between two frames in tkinter的建议创建了我自己的python脚本。

我也关注过这篇文章,How to access variables from different classes in tkinter python 3

但是,当我在帧之间切换时,我想在一帧中设置或更改共享值的值,然后在另一帧中访问它。

class MainApplication(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.app = {
            "foo": None
        }

        self.frames = {}

        for F in (PageOne, PageTwo):
            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("PageOne")

    def show_frame(self, page_name, **kwargs):
        # self.app["foo"] = kwargs.get("bar")
        frame = self.frames[page_name]
        frame.tkraise()

class PageOne(tk.Frame):

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

        button = tk.Button(self, text="Login", command=lambda: self.func())
        button.pack()

    def func(self):
        # self.controller.show_frame("PageTwo", bar="something")
        self.controller.show_frame("PageTwo")

class PageTwo(tk.Frame):

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

        print(self.controller.app["foo"])

我尝试在show_frame()函数中添加参数,允许在帧之间切换但是PageTwo中的结果仍然是None。我已经注释掉了这些线条,以显示我的尝试。

1 个答案:

答案 0 :(得分:1)

了解PageTwo.__init__在程序开始时运行,在用户有机会做任何事情之前,这一点非常重要。如果您想在切换后访问app,则必须添加在切换后运行的代码。

以下答案与您复制代码的位置相关联,向您展示了一种方法: