2017-04-13 75 views
-2

我是一名Python初学者。我在使用不同类的变量时遇到了问题。请帮忙。 这里是Using buttons in Tkinter to navigate to different pages of the application?在不同的类中使用变量

import Tkinter as tk 

class Page(tk.Frame): 
    def __init__(self, *args, **kwargs): 
     tk.Frame.__init__(self, *args, **kwargs) 
    def show(self): 
     self.lift() 

class Page1(Page): 
    def __init__(self, *args, **kwargs): 
     Page.__init__(self, *args, **kwargs) 
     label = tk.Label(self, text="This is page 1") 
     label.pack(side="top", fill="both", expand=True) 

     entry = tk.Entry(self) 
     entry.pack() 

class Page2(Page): 
    def __init__(self, *args, **kwargs): 
     Page.__init__(self, *args, **kwargs) 
     label = tk.Label(self, text="This is page 2") 
     label.pack(side="top", fill="both", expand=True) 

     text = tk.Text(self, entry.get()) 
     root.after(...) 

class MainView(tk.Frame): 
    def __init__(self, *args, **kwargs): 
     tk.Frame.__init__(self, *args, **kwargs) 
     p1 = Page1(self) 
     p2 = Page2(self) 


     buttonframe = tk.Frame(self) 
     container = tk.Frame(self) 
     buttonframe.pack(side="top", fill="x", expand=False) 
     container.pack(side="top", fill="both", expand=True) 

     p1.place(in_=container, x=0, y=0, relwidth=1, relheight=1) 
     p2.place(in_=container, x=0, y=0, relwidth=1, relheight=1) 


     b1 = tk.Button(buttonframe, text="Page 1", command=p1.lift) 
     b2 = tk.Button(buttonframe, text="Page 2", command=p2.lift) 


     b1.pack(side="left") 
     b2.pack(side="left") 


     p1.show() 

if __name__ == "__main__": 
    root = tk.Tk() 
    main = MainView(root) 
    main.pack(side="top", fill="both", expand=True) 
    root.wm_geometry("400x400") 
    root.mainloop() 

示例代码然后它有两个问题:

NameError: global name 'entry' is not defined 
NameError: global name 'root' is not defined 

如何使用这些变量?请帮忙!

+0

似乎导入无法正常工作。确定Tkinter安装正确吗? –

+0

为什么我需要这么多课程?在变量条目的情况下,你已经在Page1类中声明该变量并在Page2类中使用它。当变量绑定到它们的类时,这种情况就不会发生。如果您真的想这样做,请将条目声明为类变量,以便您可以使用Page1.entry访问相同的条目。 – DineshKumar

+0

您确实需要熟悉范围的概念以及它们与获取属性的区别。 – direprobs

回答

-1

你定义一个方法的体内的变量entry,这不会使entry访问全球范围内,这是你应该如何嵌入对象:

class Page1(Page): 
    def __init__(self, *args, **kwargs): 
     Page.__init__(self, *args, **kwargs) 
     self.label = tk.Label(self, text="This is page 1") 
     self.label.pack(side="top", fill="both", expand=True) 

     self.entry = tk.Entry(self) 
     self.entry.pack() 

正如你所看到的,你将labelentry对象嵌入self,当您调用类Page1()时,隐含类Page1的实例。在方法或函数的主体内部分配的任何变量都将变为本地到该方法或函数。这就是你应该如何使用你的代码。

熟悉这个概念:Short Description of Python Scoping Rules

编辑:

在类Page2如果你真的想访问Page1类的self.entry.get,那么你需要的类第1页的对象传递给构造函数然后从您传递给Page2.__init__的对象中获取条目,如下所示:

class Page2(Page): 
    def __init__(self, page1_obj, *args, **kwargs): 
     Page.__init__(self, *args, **kwargs) 
     self.label = tk.Label(self, text="This is page 2") 
     self.label.pack(side="top", fill="both", expand=True) 

     self.text = tk.Text(self, page1_obj.entry.get()) # access attributes of the passed-in object (page1._object) 
     root.after(...) 

在这里,您必须将一个对象传递给构造函数,然后才能访问该对象的属性,包括其绑定的方法。我之所以这样做,是因为在你的Page1课程中,你通过了selftk.Entry,所以我想你可能想用Page1的返回结果self.entry = tk.Entry(self)。如果您不打算使用Page1类的返回结果self.entry = tk.Entry(self),则可以在Page2的构造函数中添加相同的赋值:self.entry = tk.Entry(self)

+0

thx回答。但我怎么能在class2中使用self.entry.get()? – Ethan

+0

@Ethan我编辑了你的问题的答案。请参阅标题**编辑**下的编辑部分。我希望我能理解你的问题。 – direprobs

+0

感谢您的回答!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! THXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX – Ethan