2012-07-07 140 views
1

我想使用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() 

回答

2

您應該從您的事件處理程序返回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