我是 GUI 开发的新手,正在尝试使用 Python3.6+Tkinter 构建应用程序。
我有一个要求,当用户点击按钮时,我需要用新文本更改默认文本(在标签创建时显示)。为此,我正在使用 label.configure(text="<new_text>")
为了向您提供我的要求的简化版本,请考虑以下示例,其中 Label 最初显示“Welcome”。当用户单击按钮时,标签文本应更改为“流程已启动”,流程完成后标签文本应更改为“流程已完成”。这里do_something
函数运行一个需要一些时间的过程,我正在使用 time.sleep(5)
模拟运行 5 秒的进程。
from tkinter import *
from tkinter import ttk
import time
def do_something():
label.configure(text="Process Started")
time.sleep(5) #some process/script that takes few seconds to execute
label.configure(text="Process Completed")
root = Tk()
label = ttk.Label(root, text="Welcome")
label.pack()
button = ttk.Button(root, text="Click to Start Process", command=do_something)
button.pack()
root.mainloop()
预计: 我的期望是,当用户点击按钮时,Label 将显示“Process Started”5 秒,最后在流程完成执行后,label 将更新为“Process Complete”。
问题: 我看到的是,当我按下按钮时,标签文本从“欢迎”变为(5 秒后)“过程已完成”。我不明白为什么我的标签在按下按钮后没有立即显示“进程已启动”。
如上所述,我是 GUI 开发的新手,也是第一次学习 Python 和 Tkinter。所以我可能在程序本身中犯了一些错误。因此,如果我在程序流程/逻辑本身中犯了任何基本错误,请原谅我的无知。我很想听听您的想法,谢谢!
编辑:正如@Rawing 所指出的,存在一个类似的问题- Why does time.sleep pause tkinter window before it opens
然而,基本区别在于我不希望在 do_something
之前返回主循环。函数完成执行。
最佳答案
将文本更改为 “Process Started”
后,使用 label.update()
。这将在休眠
5 秒之前更新文本。
Tkinter 在其 mainloop
中完成所有工作,包括重绘标签上的文本。在您的回调中,它无法绘制它,因为您的回调尚未返回。调用 update
告诉 tkinter 在标签上运行它需要的所有任务,即使您的代码仍在运行。
关于python - 使用 Label.configure() 动态更改 Tkinter 标签文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45647366/