GObject.add_emission_hook只能工作一次

问题描述:

我想使用GObject.add_emission_hook连接来捕获一个类的所有实例的信号。它似乎工作,但只有一次。在下面的最小例子中,“接收到的信号”只打印一次,而不管其中一个按钮被点击多少次。为什么会这样?我怎样才能在每次点击时收到一个信号?GObject.add_emission_hook只能工作一次

当然,在我的应用程序中,事情更加复杂,接收器(这里是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() 

您应该从您的事件处理程序返回True,以便在连续事件中触发回调。如果你返回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() 

希望这有助于您!

+0

返回True解决问题!在gtk文档中找到这样的东西非常困难(不可能)。谢谢! – uuazed 2012-07-07 21:41:07