我是使用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中获取数据。但是,我想真正避免使用按钮。任何指针和帮助将不胜感激!
答案 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 = dummy
为None
。