Tkinter标签小部件在文本文件更改时未更新
这是我第一次使用Tkinter,我想做一个小部件,可以显示文本文件里的内容,并且当文件里的文本变化时,能够更新这个小部件。我可以让小部件读取文本文件,但就是无法让它在文本变化时自动更新。
这是我现在使用的代码:
from Tkinter import *
root = Tk()
root.minsize(740,400)
file = open("file location")
eins = StringVar()
data1 = Label(root, textvariable=eins)
data1.config(font=('times', 37))
data1.pack()
eins.set(file.readline())
root.mainloop()
我查找了关于更新小部件的帮助,但只找到在按下按钮或使用输入框时更新的内容。我在想能不能用一个每分钟运行一次的循环,但那样的话不是会一直创建新的小部件吗?
1 个回答
3
在你的例子中,你只读取了一次文件。正如你所提到的,你需要加一个循环,这样才能频繁地重新读取文件。不过,普通的循环在Tkinter中会在主线程里运行,这样会导致你的图形界面(GUI)变得没有反应。为了解决这个问题,可以使用Tkinter的after
方法。
after
方法可以安排一个函数在N毫秒后执行。例如:
from Tkinter import *
# This function will be run every N milliseconds
def get_text(root,val,name):
# try to open the file and set the value of val to its contents
try:
with open(name,"r") as f:
val.set(f.read())
except IOError as e:
print e
else:
# schedule the function to be run again after 1000 milliseconds
root.after(1000,lambda:get_text(root,val,name))
root = Tk()
root.minsize(740,400)
eins = StringVar()
data1 = Label(root, textvariable=eins)
data1.config(font=('times', 37))
data1.pack()
get_text(root,eins,"test.txt")
root.mainloop()
这个方法会一直循环,直到关闭图形界面。