Mig*_*rit 4 python user-interface tkinter python-3.6
我是 GUI 开发的新手,正在尝试使用 Python3.6+Tkinter 构建应用程序。
我有一个要求,当用户点击按钮时,我需要使用新文本更改默认文本(在创建时由标签显示)。为了实现我正在使用的label.configure(text="<new_text>")
为了向您提供我的要求的简化版本,请考虑以下示例,其中标签最初显示“欢迎”。当用户单击按钮时,标签文本应更改为“流程已启动”,流程完成后,标签文本应更改为“流程已完成”。这里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()
Run Code Online (Sandbox Code Playgroud)
预期:我的期望是当用户点击按钮时,标签将显示“进程已启动”5 秒,最后在进程执行完成后,标签将更新为“进程完成”。
问题:我看到的是,当我按下按钮时,标签文本从“欢迎”更改为(5 秒后)“处理完成”。我无法理解为什么我的标签在按下按钮后没有立即显示“进程已启动”。
如上所述,我是 GUI 开发的新手,我是第一次学习 Python 和 Tkinter。所以我可能在程序本身中犯了一些错误。因此,如果我在程序流程/逻辑本身中犯了任何基本错误,请原谅我的无知。我很想听听你的想法,谢谢!
编辑:正如@Rawing 所指出的,存在一个类似的问题 -为什么time.sleep在打开tkinter窗口之前暂停 tkinter 窗口
但是,基本的区别是我希望在do_something函数完成执行之前不返回主循环。
将文本更改为 后"Process Started",使用label.update()。这将在sleeping 5 秒之前更新文本。
Tkinter 在其 中执行所有操作mainloop,包括重新绘制标签上的文本。在您的回调中,它无法绘制它,因为您的回调尚未返回。调用update告诉 tkinter 在标签上运行它需要的所有任务,即使您的代码仍在运行。
| 归档时间: |
|
| 查看次数: |
21475 次 |
| 最近记录: |