在不同的类中使用变量

时间:2017-04-13 09:42:44

标签: python class oop

我是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

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

1 个答案:

答案 0 :(得分:-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()

正如您所看到的,当您调用类label时,您将entryself个对象嵌入到Page1,即隐含的类Page1()的实例。在方法或函数体内分配的任何变量都将成为该方法或函数的 local 。这就是你应该如何处理你的代码。

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

修改

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

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传递给self所以我认为您可能想要使用tk.Entry self.entry = tk.Entry(self)的返回结果1}}。如果您不打算使用Page1 self.entry = tk.Entry(self)Page1的返回结果,则可以在Page2 self.entry = tk.Entry(self)的构造函数中添加相同的作业。