2012-10-18 97 views
0

我正在嘗試編寫一個具有二十五個按鈕的程序,當按下它時,它將從文本文件中讀取,將其存儲在變量中,然後使標籤的文本位於底部的頁面更改爲文本文件的文本。這是我到目前爲止的代碼:從變量中更改標籤文本

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

您需要實例化Tk的實例,然後才能使用StringVar。在行之前移動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。詢問Tcl解釋器(字段名爲tk)就可以產生AttributeError

請注意,對於小部件,不提供主導致創建一個默認的,但不是變量。

整個Tkinter工具包是一個名爲Tk的Tcl工具包的包裝。 Tcl變量允許跟蹤,即在變量變化時綁定回調。 Tk大量使用這種機制,因此Tkinter必須提供對Tcl變量的訪問。