按下 tkinter GUI 上的按鈕時,通常會導致介面凍結。儘管使用了線程,問題仍然存在。透過利用Python Cookbook 中的建議,這裡有一個在執行非同步任務時保持GUI 回應能力的解決方案:
GUI 凍結的主要原因是使用join( )在後台線程上。為了防止這種情況,更好的方法是實現「輪詢」機制。
Tkinter 的一般 after() 方法可以定期連續監控 Queue。這允許 GUI 在等待線程完成時保持回應。
以下程式碼舉例說明了這種方法:
<code class="python">import Tkinter as tk import threading import queue # Create a queue for communication queue = queue.Queue() # Define the GUI portion class GuiPart(object): def __init__(self, master, queue): # Set up the GUI tk.Button(master, text='Done', command=self.end_command).pack() def processIncoming(self): while not queue.empty(): # Handle incoming messages here def end_command(self): # Perform necessary cleanup and exit # Define the threaded client class ThreadedClient(object): def __init__(self, master): # Set up GUI and thread self.gui = GuiPart(master, queue) self.thread = threading.Thread(target=self.worker_thread) self.thread.start() # Start periodic checking of the queue self.periodic_call() def periodic_call(self): self.gui.processIncoming() master.after(200, self.periodic_call) def worker_thread(self): # Perform asynchronous I/O tasks here, adding messages to the queue # Main program root = tk.Tk() client = ThreadedClient(root) root.mainloop()</code>
在此範例中, GUI 和後台執行緒透過佇列處理,允許非同步執行而不凍結GUI。
以上是如何防止 Tkinter GUI 在等待執行緒完成時凍結?的詳細內容。更多資訊請關注PHP中文網其他相關文章!