tkinter GUI のボタンが押されると、多くの場合、インターフェイスがフリーズします。スレッドを使用しているにもかかわらず、問題は解決しません。 Python クックブックのアドバイスを活用して、非同期タスクの実行中に GUI の応答性を維持するための解決策を次に示します。
GUI フリーズの背後にある主な原因は、join( ) バックグラウンド スレッド上で。これを防ぐためのより良いアプローチは、「ポーリング」メカニズムを実装することです。
Tkinter の汎用 after() メソッドを使用すると、一定の間隔でキューを継続的に監視できます。これにより、スレッドの完了を待機している間、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 中国語 Web サイトの他の関連記事を参照してください。