在不同的类中使用变量
问题描述:
我是一名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
如何使用这些变量?请帮忙!
答
你定义一个方法的体内的变量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
的实例。在方法或函数的主体内部分配的任何变量都将变为本地到该方法或函数。这就是你应该如何使用你的代码。
熟悉这个概念: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
课程中,你通过了self
到tk.Entry
,所以我想你可能想用Page1
的返回结果self.entry = tk.Entry(self)
。如果您不打算使用Page1
类的返回结果self.entry = tk.Entry(self)
,则可以在Page2
的构造函数中添加相同的赋值:self.entry = tk.Entry(self)
。
似乎导入无法正常工作。确定Tkinter安装正确吗? –
为什么我需要这么多课程?在变量条目的情况下,你已经在Page1类中声明该变量并在Page2类中使用它。当变量绑定到它们的类时,这种情况就不会发生。如果您真的想这样做,请将条目声明为类变量,以便您可以使用Page1.entry访问相同的条目。 – DineshKumar
您确实需要熟悉范围的概念以及它们与获取属性的区别。 – direprobs