2017-10-12 147 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