2017-08-12 5482 views
1

我是GUI开发新手,尝试使用Python3.6 + Tkinter构建应用程序。使用Label.configure()动态改变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() 

预期: 我意料的是,当用户点击该按钮时,标签会显示“进程启动的” 5秒和流程执行完毕后终于,标签将被更新为“过程完成”。

问题: 我看到的是,当我按下按钮时,标签文本从“欢迎”更改为(5秒后)“处理完成”。我无法理解为什么我的标签在按下按钮后没有显示“Process Started”。

如上所述,我是GUI开发新手,我第一次学习Python和Tkinter。所以我可能在程序本身上犯了一些错误。因此,如果我在程序流程/逻辑本身中犯了任何基本错误,请原谅我的无知。我很想听听你的想法,谢谢!

编辑:正如@Rawing指出,存在类似的问题 - Why does time.sleep pause tkinter window before it opens 的基本区别,然而,就是我想不会返回主循环do_something函数完成执行之前。

+0

可能的重复[为什么time.sleep暂停tkinter窗口打开之前](https://stackoverflow.com/questions/30284270/why-does-time-sleep-pause-tkinter-window-before-it-打开) –

+0

@Rawing感谢您指出一个类似的问题。但我的问题的区别是,我不希望返回到主循环,直到函数'do_comething'完全执行完毕 – MightyInSpirit

回答

2

将文字更改为"Process Started"后,请使用label.update()。这将更新sleep之前的文本5秒钟。

Tkinter在mainloop中做了所有事情,包括重新绘制标签上的文字。在您的回调中,由于您的回调尚未返回,因此无法绘制回调。调用update会告诉tkinter在标签上运行所需的所有任务,即使代码仍在运行。

+0

谢谢@ChristianFigueroa你的答案正好解决了我的查询。我还发现需要更多地了解tkinter mainloop如何在一般情况下驱动编程。感谢您向我展示正确的方向! – MightyInSpirit