2017-08-26 3 views

答えて

2

まず、ここでg_signal_connect_afterの定義は次のとおりです。

特定object.The ハンドラ用の信号にGCallback機能を接続する信号のデフォルトハンドラの後呼び出されます。

しかし、あなたが求めることができるデフォルトのハンドラがあり、よく、GSignal descriptionそれは非常にdescritiveです:

信号システムの基本的な考え方は、 信号の発信のものです。信号はタイプごとに導入され、 文字列で識別されます。親タイプのために導入された信号は、導出された タイプでも利用できます。したがって、基本的には、それは の継承されたタイプごとのファシリティです。

シグナル発信は、特定のセットのコールバックを正確に定義された方法で呼び出すことを主に伴います。このようなコールバックの2つの主なカテゴリ が、オブジェクト単位のものとユーザー提供のものです。 ( シグナルはどのような種類のインスタンス化可能なタイプにも対応できますが、私は を以下の "オブジェクトタイプ"と呼んでいます。単に がほとんどのユーザーがシグナルを受け取るコンテキストですからです)。オブジェクトごと コールバックは「オブジェクトメソッドハンドラ」または 「デフォルト(シグナルハンドラ)」と呼ばれることが最も多く、ユーザが指定したコールバックは通常「シグナルハンドラ」と呼ばれる です。

オブジェクト・メソッド・ハンドラは、信号作成時に提供されるが、(この は、最も頻繁にオブジェクトクラスの作成の終了時に起こる) ユーザ提供ハンドラが頻繁に接続され、一定である信号からの/ を切断している間オブジェクトインスタンス。

途中停止しない限り、信号の放出は、5つの段階からなる:通常ユーザ提供シグナル・ハンドラのオブジェクト・メソッド・ハンドラの

  • 呼び出しG_SIGNAL_RUN_FIRST信号用

  • 呼び出し(後フラグが設定されていない)

  • G_SIGNAL_RUN_LAST信号のオブジェクトメソッドハンドラの呼び出し

  • (後にフラグが設定されている)ユーザ提供シグナル・ハンドラ

ユーザ提供シグナル・ハンドラG_SIGNAL_RUN_CLEANUP信号のオブジェクトメソッドハンドラーの

  • 呼び出し3210

  • 呼び出しが順に呼び出されます彼らは接続されました。今、あなたは、シグナル配列を知っていること、次にくるものがanswer to a similar questionが、Gtkのメーリングリスト上で

  • g_signal_connect_afterあなたは クラスのデフォルトハンドラの後に、ユーザーハンドラを実行できるようになります。なぜこれは役に立ちますか?

    が、私はその クラスハンドラが作業を行うれる信号を「初期化」発する物体があると、あなたはおそらく、あなたの中に既に初期化 オブジェクトを使用できるように、あなたのハンドラは、クラスハンドラの後 を実行したいです関数。

    私は通常、このメソッドを使用する必要はないと考えています。 のシグナルは通常、G_SIGNAL_RUN_FIRSTでインストールされるためです。もし と誤解されていないのであれば、デフォルトのハンドラが ユーザハンドラの前に呼び出されることになります。

    これは、高いレベルの言語で使用すると明らかに必要なことはありませんが、たとえば、コールバックが最後に実行されることを保証したい場合、このメソッドを使用できます。 (pygtkは廃止予定です、pygobjectを使用してください)。

    我々は(この順序で)二つの方法、on_click2on_click1を接続する簡単な例では、on_click2ためconnect_afterを使用することによって、我々はそれが最後の(ユーザー・コールバック)を実行することを確認してください:

    import gi 
    gi.require_version("Gtk", "3.0") 
    from gi.repository import Gtk 
    
    class Button(Gtk.Box): 
    
        def __init__(self, message): 
         Gtk.Box.__init__(self, spacing=6) 
         self.set_border_width(10) 
         button = Gtk.Button.new_with_label(message) 
         self.pack_start(button, True, True, 0) 
         button.connect_after("clicked", self.on_click2) 
         button.connect("clicked", self.on_click1) 
    
        def on_click1(self, widget): 
         print ("Click1 signal. connect normal"); 
    
        def on_click2(self, widget): 
         print ("Click2 signal. connect after"); 
    
    win = Gtk.Window() 
    button = Button("Test") 
    
    win.add (button) 
    
    win.connect("destroy", Gtk.main_quit) 
    win.show_all() 
    
    Gtk.main() 
    

    そして結果

    $ python <filename.py> 
    ... (Click test button)... 
    Click1 signal. connect normal 
    Click2 signal. connect after 
    

    enter image description here

    on_click2は、それが最初に接続されていたという事実にもかかわらず、呼び出されることが最後であるということです