PyGTKでのプログレスバーについて(ウィンドウが固まる件についてとその対処)
重い処理がメインループを邪魔してしまう
重い処理を行っている最中に、set_fraction()などを呼んでプログレスバーに対して状況の更新をしようとしても、ウィンドウが固まってしまってうまく動作しない。こうなってしまう理由は、GTK+アプリケーションがイベント駆動型のプログラムであること。重い処理のせいでメインループが正常に回らず、描画も意図した通りに行われない。
残念ながら、チュートリアルは、この問題の解決には役に立たなかった。
そこでFAQを探したところ、この件についての分析と解決策が載っていた。
解決策の記述
- 重い処理はPythonのジェネレータとして書き、処理を行うループ内の最後に「yield True」を、ループの後、処理が全て終わるところで「yield False」を書く
- 処理を開始する部分では、ジェネレータオブジェクトのメンバ関数next()をgobject.idle_add()(リファレンス)に指定
これにより、メインループよりも低い優先度で(処理が終了するまで)繰り返しnext()が呼ばれる。また、この書き方だと、真偽値の変数を用意して、ループ内でその判定を行うようにすることで、途中で処理を停止するようなことも楽に行える。
実際のコード例は別記事で扱う。