「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > スレッドの終了を待機しているときに tkinter GUI の応答性を維持するにはどうすればよいですか?

スレッドの終了を待機しているときに tkinter GUI の応答性を維持するにはどうすればよいですか?

2024 年 11 月 6 日に公開
ブラウズ:314

How to Keep Your tkinter GUI Responsive When Waiting for Threads to Finish?

スレッドの完了を待機中に 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