python - 使用 Label.configure() 动态更改 Tkinter 标签文本

标签 python user-interface tkinter python-3.6

我是 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/

相关文章:

python - 使用 Scrapy 获取 img src 会得到奇怪的结果,为什么?

java - 在 JPanel 中绘制一个矩形,捕捉到最近的 x 像素

python - 使用 tkinter,python 将输入数据显示到文本框中时出现问题

python - 有条件地迭代对象的组合

python - Reportlab 不在 Google App Engine 上的 Django 应用程序中生成图表

java - 间接绘制AWT/Swing组件?

javascript - 为我的第一个 Web 应用程序推荐适合初学者的 JavaScript 轮播

python - tkinter python 的全局变量问题

python - 使用 Tkinter 的 'command = ' 中的 lambda 函数。

python - put_block_blob_from_path 是否已弃用?