2017-08-12 5477 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