GUI アプリケーションを設計する場合、時間のかかるタスクを実行しながら UI の応答性を維持することが重要です。人気の Python GUI ライブラリである Tkinter は、メイン イベント ループのブロックを防ぐマルチスレッド機能を提供します。
問題:
「開始」ボタンと、プログレスバー。望ましい動作は次のとおりです:
しかし、問題は発生します。プログレスバーが表示される前に、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 中国語 Web サイトの他の関連記事を参照してください。