我是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 :(得分:-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
时,您将entry
和self
个对象嵌入到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)
的构造函数中添加相同的作业。