2017-10-12 149 views
-1

下面的脚本文本标签,退出按钮创建一个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()开始使用。我如何解决它?

+0

您是否可以缩进'set_label_text'函数来使其分开'init_window?' – GreenSaber

+0

只需缩进它 - 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

回答

3

要解决该问题,可以使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