GUI

Python Tkinter Event Loop(2) ブロック

イベントループが長時間イベント処理を行わない場合、問題が発生する。結果として、アプリケーションは再描画されず、イベントにも反応せず、フリーズしているように見える。この状態をイベントループがブロックされていると表現される。何が起きているかを確認する。

まず、イベントループを実行のタイムラインとして可視化する。通常の場合、イベントループからの逸脱(コールバック、画面の更新)は、イベントループに制御を戻すまで、わずかな時間(ほんの数秒)しかかからない。

イベントループの実行タイムライン

イベントループをブロックするシナリオを考える。おそらくユーザーがボタンを押したようなイベント(以下の図のイベント#1)から始まり、そこでイベントループはアプリケーションのコードを呼び出し、イベントを処理させる。プログレスバーを作成し、(長い)処理を実行し、プログレスバーを停止する。この後、アプリケーションのコードはイベントループに制御を戻す。この間、何のイベントも処理されず、画面の更新(再描画)も行われない。イベントはイベントキューに溜まっている。

イベントループをブロックするコールバックの例

イベントループがブロックされないようにするためには、イベントハンドラを素早く実行し、イベントループに制御を戻す必要がある。

もし、長時間実行する操作があったり、ネットワークI/Oのように長時間かかる可能性がある場合は、いくつかの異なるアプローチが取れる。