2017-10-12 14 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 오류가 발생합니다. 그래서 문제는 test_label에서 생성 된 init_window()set_label_text() 범위에서 벗어날 수 없다는 것입니다. 어떻게 수정해야합니까?

+0

'set_label_text' 함수를 들여다 써서'init_window? '를 없앨 수 있습니까? – GreenSaber

+0

그냥 들여 쓰기 만하면됩니다. 들여 쓰기 및 변경 : 'def set_label_text (self) : self.test_label.config (text = '값 변경')' does not work; 들여 쓰기 및 변경 : 'def set_label_text() : test_label.config (text = '값 변경')' 도 작동하지 않습니다. 모든 경우에''Window '객체에'set_label_text'' 속성의 오류가 없습니다. – t411tocreate

답변

3

이 문제를 해결하려면 접두사를 사용하여 test_label을 인스턴스 변수로 만들 수 있습니다.

self.test_label = Label(root, text="none") 
self.test_label.grid(row=0, column=0, sticky=W) 
을 (이 당신의 모든 버튼의 약자) 별도의 줄에 각각의 방법을 배치하는 대신 - 당신이 그런 방법을 체인 때 게다가, 무슨 일이 grid() 반환 None 때문에, 당신의 변수에 None를 할당입니다

물론 set_label_text 함수에서 나중에 self.test_label으로 참조해야합니다.

그 외, 어떤 이름을 가져올 지 모르기 때문에 from tkinter import *을 제거하는 것이 좋습니다. 이전에 가져온 이름을 대체 할 수 있으므로 프로그램의 이름이 어디에서 왔는지를 알기가 매우 어렵습니다. 대신 import tkinter as tk을 사용하십시오.