スクリーンショットツール、ひとまず完成。

以前、scrot というスクリーンショットツールのUIをPython + PyGTKで
作成中という記事を書きました。

↓こんな感じのやつです。

そのときに抱えていた問題が解決しました!!

そのときの問題は、

スクリーンショットを取るボタンを押した時にウインドウを非表示にしているはずなのに、非表示になっていない

というものでした。

gtk.Windowにたいしてhide_all()を呼び出すと、たしかに非表示になるのですが
すぐには実行されないことが原因でした。

gtkにかぎらず、イベント駆動型のフレームワークでは、ユーザからの操作や
描画の更新などといった処理は、一部の関数を除き、すぐには実行されません。
一端イベントキューに登録され、処理がイベントループに戻ったタイミングで
キューから取り出され実行されます。

このため、一連の処理の流れ(同じメソッドの中など)で

1. ウインドウを非表示。
2. スクリーンショットの実行

という処理を行ってしまうと、処理がイベントループに戻る前にスクリーンショット
を実行することになってしまい、意図した動作になりません。

いろいろ調べながら試したところ、以下の方法で解決しました。

1. ウインドウを非表示。
2. 未解決のイベントを強制的に処理
3. スクリーンショットの実行

        • -

上記2.の処理は次のようにしました。

while gtk.event_pending():
  gtk.main_iteration()

スクリーンショットが実行される前にイベントキューに登録されている
未解決のイベントを全て処理するので、ウインドウが非表示になりました。

これで、残る課題は
・設定内容をファイルに書き出して、次回起動時にその設定を読み込む。

です。