蟒蛇 - 改变Tkinter的标签
问题描述:
下面的脚本文本标签,退出按钮创建一个Tkinter的窗口,更改文本按钮:蟒蛇 - 改变Tkinter的标签
from tkinter import *
from tkinter import ttk
class Window(Frame):
def __init__(self, master=None):
Frame.__init__(self, master)
self.master = master
self.init_window()
def init_window(self):
test_label = Label(root, text="none").grid(row=0, column=0, sticky=W)
change_text_btn = Button(root, text="change_text", command=self.set_label_text).grid(row=2, column=0, sticky=W)
exit_btn = Button(root, text="Exit", command=self.client_exit).grid(row=2, column=1, sticky=W)
def set_label_text(self):
test_label.config(text='changed the value')
def client_exit(self):
exit()
if __name__ == '__main__':
root = Tk()
app = Window(root)
root.mainloop()
点击change_text_btn
后,我得到一个NameError: name 'test_label' is not defined
错误。所以问题是在init_window()
中创建的test_label
无法从set_label_text()
开始使用。我如何解决它?
答
要解决该问题,可以使test_label
作为实例变量前缀self
。除此之外,当你连锁这样的方法,会发生什么情况是指定None
你的变量,因为grid()
回报None
- 相反,将每个方法在一个单独的行(这表示所有的按钮):
self.test_label = Label(root, text="none")
self.test_label.grid(row=0, column=0, sticky=W)
当然,您需要在set_label_text
函数中稍后参考self.test_label
。
除此之外,我建议你摆脱from tkinter import *
,因为你不知道什么名称进口。它可以替换您之前导入的名称,并且很难查看程序中的名称应该来自哪里。改为使用import tkinter as tk
。
您是否可以缩进'set_label_text'函数来使其分开'init_window?' – GreenSaber
只需缩进它 - doesent工作; 缩进和像这样变化: 'def set_label_text(self): self.test_label.config(text ='changed the value')' doesen't work; 缩进并像这样改变: 'def set_label_text(): test_label.config(text ='changed the value')' doesen't work to; 在所有情况下,我得到''窗口'对象没有属性'set_label_text''错误 – t411tocreate