2012-10-18 93 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变量的访问。