为何该循环每次迭代都会创建新的Entry组件而非仅刷新内容?
解决Tkinter每次循环新建Entry组件的问题
嘿,我一眼就看出问题啦!你这段代码的核心问题是每次调用task()函数时,都会新建一个Entry组件并把它打包到窗口里,所以运行一会儿窗口就会被一堆重复的输入框占满,完全不是刷新内容的正确姿势。
问题出在哪?
看你这段代码:
from tkinter import * import psutil def task(): e = Entry(root) # 每次调用都新建一个Entry! e.pack() # 每次都把新Entry加到窗口里 e.delete(0, END) e.insert(0,psutil.cpu_percent(interval=None)) s = e.get() root.after(500, task) root = Tk() root.after(500, task) root.mainloop()
e = Entry(root)和e.pack()这两行放在task()里,就意味着每0.5秒就会诞生一个新的输入框,而不是更新已有输入框的内容。
正确的做法:只创建一次Entry,重复更新内容
我们只需要把Entry组件的创建和打包逻辑放到task()外面,让它只执行一次,然后在task()里只做内容更新的操作就好:
from tkinter import * import psutil def task(): # 直接操作已有的entry组件,更新内容 entry.delete(0, END) entry.insert(0, psutil.cpu_percent(interval=None)) # 0.5秒后再次调用task,实现循环刷新 root.after(500, task) root = Tk() # 只创建一次Entry组件并打包到窗口 entry = Entry(root) entry.pack() # 启动首次任务 root.after(500, task) root.mainloop()
为什么这样可行?
- 我们在全局作用域创建了唯一的
entry对象,窗口里只会有这一个输入框。 task()函数里只负责清空输入框内容、插入新的CPU使用率数据,然后重新调度下一次更新,完全不会新建组件。
这样运行起来,窗口里就只有一个输入框,它会每隔0.5秒自动刷新显示当前的CPU使用率啦!
内容的提问来源于stack exchange,提问作者Ted Jones
相关产品推荐
相关产品推荐

