以下脚本创建一个带有文本标签,退出按钮和更改文本按钮的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
错误。所以问题在于test_label
中创建的init_window()
无法从set_label_text()
中获得范围。我该如何解决?
答案 0 :(得分:3)
要解决此问题,您可以通过在test_label
前添加self
作为实例变量。除此之外,当您链接这样的方法时,您会将None
分配给您的变量,因为grid()
返回None
- 而是将每个方法放在一个单独的行中(这代表所有按钮):
self.test_label = Label(root, text="none")
self.test_label.grid(row=0, column=0, sticky=W)
当然,您需要稍后在self.test_label
函数中使用set_label_text
引用它。
除此之外,我建议你摆脱from tkinter import *
,因为你不知道进口的名字。它可以替换您之前导入的名称,这使得很难看到程序中的名称应该来自哪里。请改用import tkinter as tk
。