2012-10-18 13 views
0

25 개의 버튼이있는 프로그램을 작성하려고합니다. 하나를 누르면 텍스트 파일에서 읽고 변수에 저장 한 다음 하단에 레이블 텍스트를 작성합니다 페이지의 텍스트 파일 텍스트로 변경됩니다. 여기 내 코드는 지금까지 있습니다 :변수에서 레이블 텍스트 변경

from Tkinter import* 
box1 = 'C:/Users/Geekman2/Documents/Tests/box1.txt' 
var = StringVar() 
var.set("man") 
def openfile(filename): 
    filetxt = (open(filename,"r").read()) 
    #filetxt.set(iletxt) 
    print filetxt 
    return filetxt 

def Box1(): 
    openfile(box1) 


openfile(box1) 
donut = Tk() 
donut.geometry('450x450') 

cupcake = Button(donut,text = "Box #1", command= Box1) 
cupcake.pack() 

Whatsin = Label(donut,textvariable = var) 
Whatsin.pack(side =BOTTOM) 

donut.mainloop() 

이 두 라인은 내가 그들을 주석을 해제 할 때마다, 나에게 문제를주고 내가 오류 얻을 프로그램을 실행하려고하는 "AttributeError를 'NoneType'객체는 'TK'를 어떤 속성이 없습니다"

var = Stringvar() 
var.set("man") 

아무도이 문제의 원인이 무엇인지 알 수 있습니까? 나는 오류의 의미를 알고 있지만이 상황에서는 적용 할 수 없다고 말할 수 있습니다.

답변

3

StringVar을 사용하려면 먼저 Tk의 인스턴스를 인스턴스화해야합니다. 라인 앞에 donut = Tk()을 놓으면 제대로 작동합니다.

0

StringVar (다른 Tkinter 변수와 마찬가지로)는 Tcl 변수 주위의 래퍼입니다. Tcl 인터프리터가 초기화되기 전에 StringVar을 작성하면 오류가 발생합니다.

따라서 변수를 만들기 전에 Tk() (이러한 초기화를 수행)이라고 할 수 있습니다.

StringVar 생성자 서명을 보면 : __init__(self, master=None, value=None, name=None) 다른 Tkinter 객체처럼 생성자는 첫 번째 인수로 master을 허용합니다. 이 마스터는 본질적으로 Tcl 인터프리터에 액세스하는 데 필요합니다. 제공되지 않으면 Tkinter.Tk 인스턴스 _default_root (예 : None)으로 폴백 (fallback)됩니다. Tcl 인터프리터 (필드 이름 tk)에게 AttributeError을 올리십시오.

위젯의 경우 기본 리드를 생성하기 위해 마스터 리드를 제공하지 않고 변수를 작성하지 않도록주의하십시오.

전체 Tkinter 툴킷은 Tk라고하는 Tcl 툴킷을 둘러싼 래퍼입니다. Tcl 변수는 을 추적 할 수 있습니다. 즉 변수 변경시 콜백을 바인드합니다.입니다. Tk는이 메커니즘을 많이 사용하므로 Tkinter는 Tcl 변수에 대한 액세스를 제공해야합니다.