使用 Label.configure() 动态更改 Tkinter 标签文本
Changing Tkinter Label Text Dynamically using Label.configure()
我是 GUI 开发的新手,正在尝试使用 Python3.6+Tkinter.
构建应用程序
我有一个要求,当用户点击按钮时,我需要用新文本更改默认文本(标签在创建时显示)。为此,我使用 label.configure(text="<new_text>")
为了提供我的要求的简化版本,请考虑以下示例,其中 Label 最初显示 "Welcome"。当用户单击按钮时,标签文本应更改为 "Process Started",在该过程完成后,标签文本应更改为 "Process Completed"。这里 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()
预计:
我的期望是,当用户点击 Button 时,Label 将显示 "Process Started" 5 秒,最后在过程完成执行后,label 将更新为 "Process Complete".
问题:
我看到的是,当我按下按钮时,标签文本从 "Welcome" 变为(5 秒后)"Process Completed"。我无法理解为什么我的标签在按下按钮后没有立即显示 "Process Started"。
如上所述,我是 GUI 开发的新手,也是第一次学习 Python 和 Tkinter。所以我可能在程序本身中犯了一些错误。如果我在程序 flow/logic 本身中犯了任何基本错误,请原谅我的无知。我很想听听你的想法,谢谢!
编辑:正如@Rawing 所指出的,存在类似的问题 -
然而,基本区别在于我不希望在 do_something
函数完成执行之前 return 进入主循环。
将文本更改为 "Process Started"
后,使用 label.update()
。这将在 sleep
ing 5 秒之前更新文本。
Tkinter 在其 mainloop
中完成所有工作,包括重绘标签上的文本。在您的回调中,它无法绘制它,因为您的回调尚未返回。调用 update
告诉 tkinter 运行 它需要在标签上完成的所有任务,即使您的代码仍然是 运行ning.
我是 GUI 开发的新手,正在尝试使用 Python3.6+Tkinter.
构建应用程序我有一个要求,当用户点击按钮时,我需要用新文本更改默认文本(标签在创建时显示)。为此,我使用 label.configure(text="<new_text>")
为了提供我的要求的简化版本,请考虑以下示例,其中 Label 最初显示 "Welcome"。当用户单击按钮时,标签文本应更改为 "Process Started",在该过程完成后,标签文本应更改为 "Process Completed"。这里 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()
预计: 我的期望是,当用户点击 Button 时,Label 将显示 "Process Started" 5 秒,最后在过程完成执行后,label 将更新为 "Process Complete".
问题: 我看到的是,当我按下按钮时,标签文本从 "Welcome" 变为(5 秒后)"Process Completed"。我无法理解为什么我的标签在按下按钮后没有立即显示 "Process Started"。
如上所述,我是 GUI 开发的新手,也是第一次学习 Python 和 Tkinter。所以我可能在程序本身中犯了一些错误。如果我在程序 flow/logic 本身中犯了任何基本错误,请原谅我的无知。我很想听听你的想法,谢谢!
编辑:正如@Rawing 所指出的,存在类似的问题 - do_something
函数完成执行之前 return 进入主循环。
将文本更改为 "Process Started"
后,使用 label.update()
。这将在 sleep
ing 5 秒之前更新文本。
Tkinter 在其 mainloop
中完成所有工作,包括重绘标签上的文本。在您的回调中,它无法绘制它,因为您的回调尚未返回。调用 update
告诉 tkinter 运行 它需要在标签上完成的所有任务,即使您的代码仍然是 运行ning.