从变量中更改标签文本
问题描述:
我正在尝试编写一个具有二十五个按钮的程序,当按下它时,它将从文本文件中读取,将其存储在变量中,然后使标签的文本位于底部的页面更改为文本文件的文本。这是我到目前为止的代码:从变量中更改标签文本
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")
有谁能告诉我这可能是什么原因?我知道错误的含义,但据我所知它不适用于这种情况。
答
您需要实例化Tk
的实例,然后才能使用StringVar
。在行之前移动donut = Tk()
,它应该可以工作。
答
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变量的访问。