Tkinter标签小部件在文本文件更改时未更新

2 投票
1 回答
2976 浏览
提问于 2025-04-18 02:18

这是我第一次使用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()

这个方法会一直循环,直到关闭图形界面。

撰写回答