问题描述
我正在通过tkinter上的Oreilly教程,但是该教程中提供的代码对我不起作用。没有显示“选择一个”消息,而是显示:PY_VAR0
。当我单击hello按钮时,什么都没有发生。当我单击“再见”按钮时,窗口将按预期关闭,但未显示任何消息。
值得注意的是,我之前有过
def say_hello(self):
self.label.configure(text="Hello World!")
def say_goodbye(self):
self.label.configure(text="Goodbye! \n (Closing in 2 seconds)")
self.after(2000,self.destroy)
并收到属性错误:attributeError:'_tkinter.tkapp'对象没有属性'label'site:stackoverflow.com。
我不确定这是怎么回事,因为我在两种情况下都明确遵循了示例。
我的代码如下:
import tkinter as tk
class Window(tk.Tk):
def __init__(self):
super().__init__()
self.title('Hello Tkinter')
self.label_text = tk.StringVar()
self.label_text.set("Choose One")
label = tk.Label(self,text=self.label_text)
label.pack(fill=tk.BOTH,expand=1,padx=100,pady=30)
hello_button = tk.Button(self,text='Say Hello',command=self.say_hello)
hello_button.pack(side=tk.LEFT,padx=(20,0),pady=(0,20))
goodbye_button = tk.Button(self,text ='Say Goodbye',command=self.say_goodbye)
goodbye_button.pack(side=tk.RIGHT,padx=(0,20),20))
def say_hello(self):
self.label_text.set("Hello World!")
def say_goodbye(self):
self.label_text.set("Goodbye! \n (Closing in 2 seconds)")
self.after(2000,self.destroy)
if __name__ == "__main__":
window = Window()
window.mainloop()
解决方法
您需要设置标签textvariable=self.label_text
而不是text=self.label_text
import tkinter as tk
class Window(tk.Tk):
def __init__(self):
super().__init__()
self.title('Hello Tkinter')
self.label_text = tk.StringVar()
self.label_text.set("Choose One")
label = tk.Label(self,textvariable=self.label_text)
label.pack(fill=tk.BOTH,expand=1,padx=100,pady=30)
hello_button = tk.Button(self,text='Say Hello',command=self.say_hello)
hello_button.pack(side=tk.LEFT,padx=(20,0),pady=(0,20))
goodbye_button = tk.Button(self,text ='Say Goodbye',command=self.say_goodbye)
goodbye_button.pack(side=tk.RIGHT,padx=(0,20),20))
def say_hello(self):
self.label_text.set("Hello World!")
def say_goodbye(self):
self.label_text.set("Goodbye! \n (Closing in 2 seconds)")
self.after(2000,self.destroy)
if __name__ == "__main__":
window = Window()
window.mainloop()