スレッドの完了を待機中に tkinter GUI がフリーズ/ハングする
Python で tkinter GUI ツールキットを使用するときによく発生する問題特定の操作を実行するときにインターフェイスがフリーズまたはハングする。これは多くの場合、メイン イベント ループ内でスレッドの結合などのブロック操作が使用されていることが原因です。
tkinter Mainloop について
tkinter mainloop() は次のとおりです。ユーザー入力の処理と GUI の更新を担当します。単一のスレッドで継続的に実行され、イベントを受信して処理します。スレッドの完了を待つなど、メインループをブロックする操作を行うと、GUI が応答しなくなる可能性があります。
解決策: 非同期タスクに After メソッドを使用する
メインループのブロックを回避するには、タスクを特定の間隔で実行できるようにスケジュール設定できる after() メソッドの使用を検討してください。定期的にキューをポーリングしたり、バックグラウンドで他のタスクを実行したりすることで、GUI の応答性を確保できます。
GUI と非同期タスクの分離
これを実装するには、GUI と非同期タスクを分離します。非同期タスクからの GUI ロジック。 GUI を処理するクラスを作成し、定期的にスケジュールされた after() メソッド内でキューからのメッセージを処理します。別のスレッドで、非同期タスクを実行し、必要に応じてキューにメッセージを入力します。
サンプル コード
from threading import Thread
from queue import Queue
import tkinter as tk
class GuiPart:
def __init__(self, master, queue):
self.queue = queue
# Set up GUI elements here
def process_incoming(self):
while not self.queue.empty():
message = self.queue.get()
# Process and handle the message here
class AsynchronousTask:
def __init__(self, queue):
self.queue = queue
def run(self):
# Perform asynchronous task here
# Put messages into the queue as needed
def start_gui():
root = tk.Tk()
queue = Queue()
gui = GuiPart(root, queue)
async_task = AsynchronousTask(queue)
# Start the asynchronous task in a separate thread
t = Thread(target=async_task.run)
t.start()
# Start the GUI mainloop
root.mainloop()
if __name__ == "__main__":
start_gui()
このコードは、GUI ロジックを非同期タスクから分離し、タスクがバックグラウンドで実行されている間も GUI の応答性を維持する方法を示しています。
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3