1

GObject.add_emission_hookを使用して接続し、クラスのすべてのインスタンスのシグナルをキャッチしたいと思います。うまくいくようですが、一度だけです。以下の最小限の例では、ボタンの1つが何度クリックされても、「受信信号」は1回だけ印刷されます。それはなぜですか、クリックするたびに信号を受信するにはどうすればよいですか?

もちろん、私のアプリケーションでは物事はもっと複雑で、受信機(ここではクラスFoo)は信号を発しているオブジェクトを知りません。したがって、オブジェクト自体の信号に接続することはできません。

from gi.repository import Gtk
from gi.repository import GObject

class MyWindow(Gtk.Window):

    def __init__(self):
        Gtk.Window.__init__(self, title="Hello World")
        vbox = Gtk.VBox()
        self.add(vbox)
        button = Gtk.Button(label="Click Here")
        vbox.pack_start(button, True, True, 0)
        button = Gtk.Button(label="Or There")
        vbox.pack_start(button, True, True, 0)
        self.show_all()

class Foo:

    def __init__(self):
        GObject.add_emission_hook(Gtk.Button, "clicked", self.on_button_press)

    def on_button_press(self, *args):
        print "signal received"


win = MyWindow()
foo = Foo()
Gtk.main()
4

1 に答える 1

3

True連続するイベントでコールバックがトリガーされるようにするには、イベントハンドラーから戻る必要があります。あなたが戻っFalseた場合(あなたが何も返さないとき、私は推測していますFalse)、フックは削除されます。これは、サンプルに基づいた次の例で説明できます。

from gi.repository import Gtk
from gi.repository import GObject

class MyWindow(Gtk.Window):

    def __init__(self):
        Gtk.Window.__init__(self, title="Hello World")
        vbox = Gtk.VBox()
        self.add(vbox)
        self.connect("destroy", lambda x: Gtk.main_quit())
        button = Gtk.Button(label="Click Here")
        vbox.pack_start(button, True, True, 0)
        button = Gtk.Button(label="Or There")
        vbox.pack_start(button, True, True, 0)
        self.show_all()

class Foo:
    def __init__(self):
        self.hook_id = GObject.add_emission_hook(Gtk.Button, "button-press-event", self.on_button_press)
        GObject.add_emission_hook(Gtk.Button, "button-release-event", self.on_button_rel)

    def on_button_press(self, *args):
        print "Press signal received"
        return False # Hook is removed

    def on_button_rel(self, *args):
        print "Release signal received"
        # This will result in a warning
        GObject.remove_emission_hook(Gtk.Button, "button-press-event",self.hook_id)
        return True


win = MyWindow()
foo = Foo()
Gtk.main()

お役に立てれば!

于 2012-07-07T15:56:14.470 に答える