設計 GUI 應用程式時,在執行耗時任務時保持 UI 回應能力至關重要。 Tkinter 是一個流行的 Python GUI 函式庫,提供多執行緒功能來防止主事件循環阻塞。
問題:
考慮一個有「開始」按鈕的場景,進度條。期望的行為是:
但是問題出現:GUI 凍結5 秒,然後出現進度條。這是因為主執行緒被耗時的任務阻塞。
執行緒基礎:
為了解決這個問題,我們採用多執行緒。執行緒允許多個任務同時運行,防止 GUI 凍結。然而,有效地使用線程以避免干擾主線程是至關重要的。
使用單獨的類別的解決方案:
在這種情況下,我們可以建立一個單獨的類別處理耗時的任務並透過佇列與GUI進行通信。主執行緒將定期檢查佇列中的結果。這種方法允許 GUI 在任務在不同執行緒中運行時保持回應。
程式碼實作:
import queue class GUI: # ... def tb_click(self): self.progress() self.prog_bar.start() self.queue = queue.Queue() ThreadedTask(self.queue).start() self.master.after(100, self.process_queue) def process_queue(self): try: msg = self.queue.get_nowait() # Show result of the task if needed self.prog_bar.stop() except queue.Empty: self.master.after(100, self.process_queue) class ThreadedTask(threading.Thread): def __init__(self, queue): super().__init__() self.queue = queue def run(self): time.sleep(5) # Simulate long running process self.queue.put("Task finished")
注意事項:
以上是Tkinter 多執行緒如何防止長時間運行任務期間 GUI 凍結?的詳細內容。更多資訊請關注PHP中文網其他相關文章!