2

別のアプリケーション内で PyGTK を使用してユーザー入力を取得しています。チェックボタンがたくさんあるウィンドウを作成していますが、応答に応じて先に進む必要があります。

問題は、Pythonでwindowの関数とその操作を呼び出すと、プログラムがwindowからの応答を待たないことですか? ウィンドウからの応答を待つことができるようにするにはどうすればよいですか??

また、ウィンドウの代わりにダイアログを使用できるかどうかもわかりません。ダイアログにチェックボタンを追加しようとしたのですが、うまくいきませんでした。ウィンドウの使用が適切でない場合、誰かがダイアログで私を助けることができますか?

ご協力いただきありがとうございます。

4

2 に答える 2

7

(古い質問ですが、回答に値します)

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)。通常、この手法と組み合わせてダイアログを使用するので、自分でボタンを作成する必要はありません。その場合、clickedonに接続する代わりに、 on ダイアログ ( ) にok_button接続し、応答コードを読んで何を返したいかを知ることができます。通常、オブジェクト変数を応答値に設定し、実行時にそれを処理します。ユーザーがキャンセルをクリックしたことがわかります。responseselfreturn None

編集:これは他のウィンドウだけでなく、コードをブロックしたいがGUIをフリーズさせたくないアクションでも機能することにも言及する必要があります。たとえば、このパターンを と組み合わせて使用​​して、gobject.timeout_addgit クローン作成を表すプログレス バーをアニメーション化しました。nこれを使用して、単一の for ループを使用してリポジトリのクローンを作成する単一の関数を作成することができました。これは非常に強力なパターンです。

于 2013-08-02T16:19:13.760 に答える
0

この回答には、コールバック関数を使用した例があります: How can I pass variables between two classes/windows in PyGtk?

呼び出されたウィンドウを確認したら、呼び出し元のウィンドウ/オブジェクトのコールバック関数を実行します。

于 2013-05-20T15:26:19.687 に答える