python - 更改tkinter标签

时间:2017-10-12 12:39:33

标签: python tkinter scope

以下脚本创建一个带有文本标签,退出按钮和更改文本按钮的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()中获得范围。我该如何解决?

1 个答案:

答案 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