Python Tkinter在类或框架之间传递变量

时间:2018-11-29 17:38:26

标签: python tkinter

我是使用tkinter进行的新的OOP和UI开发。我目前有以下代码:

class Snapshot_app(Tk):
    def __init__(self):
        Tk.__init__(self)
        container = Frame(self)
        container.pack(side="top", fill="both", expand=True)
        self.frames = {}
        for F in (StartPage, PageOne,PageTwo):
            frame = F(container, self)
            self.frames[F] = frame
            frame.grid(row=0, column=0, sticky=NSEW)

        self.show_frame(StartPage)

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

Class PageOne(Frame):
    def __init__(self, parent, controller):
        Frame.__init__(self, parent)

        Label(self, text="Path to files").grid(row=1,column=0)

        self.fname = Entry(self)
        self.fname.grid(row=1, column=1)
        app.frames[PageTwo].dummy = self.fname.get()
        b = Button(self,text="Open Page 2",command=lambda:app.show_frame(PageTwo)).grid(row=2,column=1)

Class PageTwo(Frame):
    def __init__(self, parent, controller,dummy=None):
        Frame.__init__(self, parent)
        self.data = dummy     
        print(self.data)

app = Snapshot_app()
app.title("Snapshot Tool")
app.geometry("1200x400")
app.mainloop()

在PageTwo类中,它给了我一个错误,说self.data = None。这意味着我无法将虚拟信息从PageOne传递给PageTwo。但是,如果我在PageTwo上放置了一个按钮,该按钮的事件触发了self.data的打印,那么我就能够成功地从PageOne中获取数据。但是,我想真正避免使用按钮。任何指针和帮助将不胜感激!

1 个答案:

答案 0 :(得分:0)

问题与创建PageTwo实例有关。 您的实例化Snapshot_app()。循环开始并实例化StartPage,后跟PageOne。此时正在调用PageOne.__init__设置

app.frames[PageTwo].dummy = self.fname.get()

我认为,这甚至不起作用,因为尚未将PageTwo添加到app.frames,因为循环一直到PageOne位置。在这种情况下,您应该收到一个KeyError: PageTwo。如果不是这种情况(我不知道,您是否共享了整个代码),并且如果您已经在其他地方实例化了它,那么它就会存在,但是在实例化PageOne之后,将继续进行for循环。 PageTwo覆盖了整个现有app.frames[PageTwo]条目,并在没有虚拟参数的情况下实例化了它,因此导致self.data = dummyNone