(古い質問ですが、回答に値します)
pmoleri は受け入れ可能な回答を提供しましたが (これは私が最初にこのケースを処理した方法です)、コールバックを追加するとプログラム フローがわかりにくくなるため、イライラすることがわかりました。gtk.Dialog のように動作するウィンドウがあり、window.run() を呼び出すことができ、応答が得られるまでそこでブロックされますが、GUI は引き続き実行されます。gtk.main() を使用して、この機能を自分で実行できます。
import gtk
class BlockingWindow(gtk.Window):
def __init__(self,checkmark_values):
gtk.Window.__init__(self)
self.checkmarks = {}
# Create check marks here, put them in a dictionary
# relating their name to their widget
# Also create ok button
ok_button.connect("clicked",self.on_ok_button_clicked)
def on_ok_button_clicked(self,button):
gtk.main_quit()
def run(self):
self.show_all()
gtk.main()
self.destroy()
return dict((x,self.checkmarks[x].get_active()) for x in self.checkmarks)
blocking_window = BlockingWindow(["option1","option2"])
values = blocking_window.run()
print "option1 is {}".format(values["option1"])
print "option2 is {}".format(values["option2"])
gtk.main は入れ子にすることができるので、このパターンは別の GUI ウィンドウ内でも機能します。たとえば、メイン ウィンドウから同じことを実行します (明らかに、"run" という名前は特別なものではありません。 「get_values」など)。
ダイアログの使用に関しては、ダイアログ ウィンドウにウィジェットを追加するために、ダイアログの「vbox」属性を参照することもできますself.vbox.pack_start(my_checkbox)
。通常、この手法と組み合わせてダイアログを使用するので、自分でボタンを作成する必要はありません。その場合、clicked
onに接続する代わりに、 on ダイアログ ( ) にok_button
接続し、応答コードを読んで何を返したいかを知ることができます。通常、オブジェクト変数を応答値に設定し、実行時にそれを処理します。ユーザーがキャンセルをクリックしたことがわかります。response
self
return None
編集:これは他のウィンドウだけでなく、コードをブロックしたいがGUIをフリーズさせたくないアクションでも機能することにも言及する必要があります。たとえば、このパターンを と組み合わせて使用して、gobject.timeout_add
git クローン作成を表すプログレス バーをアニメーション化しました。n
これを使用して、単一の for ループを使用してリポジトリのクローンを作成する単一の関数を作成することができました。これは非常に強力なパターンです。