2016-03-01 30 views
1

对于我正在处理的项目,我使用的是自定义信号,这些自定义信号发送给子级,然后在信号未完全处理时传播给它父级。自定义信号不传播

根据我可以发现的信息,似乎在回调中没有连接处理程序(使用connect)或返回False应允许信号传播到小部件父项。

然而,在低于这个我的玩具例如不工作:

class MyWindow(Gtk.Window): 
    def __init__(self): 
     Gtk.Window.__init__(self) 

     GObject.signal_new("print-this", GObject.TYPE_OBJECT, GObject.SIGNAL_RUN_LAST, GObject.TYPE_BOOLEAN, [GObject.TYPE_STRING]) 

     self.button = Gtk.Button.new_with_label("Emit signals") 
     self.button.connect("clicked", self.emit_signals) 

     self.frame = Gtk.Frame.new("Some frame") 
     self.frame.add(self.button) 
     self.add(self.frame) 

     self.connect("print-this", self.got_it) 
     self.show_all() 
     Gtk.main() 

    def got_it(self, widget, string): 
     print string 
     return False 

    def emit_signals(self, *args): 
     print "Emitting signals.." 
     self.button.emit("print-this", "I was emitted from the button") 
     time.sleep(1) 
     self.frame.emit("print-this", "I was emitted from the frame") 
     time.sleep(1) 
     self.emit("print-this", "I was emitted from the window") 

当信号发出我期望打印所有三个发射但我只得到窗口上的发出打印。这可能是由于信号根本没有传播。

那么我在哪里错了?更重要的是,我如何才能实现我正在寻找的传播行为?

+0

信号与GObject类相关联。 'print-this'信号只存在于你的'MyWindow'类中,而不是'GtkButton'或'GtkFrame',所以'self.button.emit()'和'self.frame.emit()'调用不存在信号。反正你什么也得不到;即使这些信号确实存在,也没有任何东西与他们连接。 – andlabs

+0

我认为'GObject.signal_new'会将信号与所有GObject类关联,但根据您的评论,我认为这是错误的?那么我需要如何定义它们呢? (当然下一步将是他们如何传播?) – B8vrede

+0

你认为信号如何工作? (我不知道Python,但我假设'GObject.'正在调用GObject类的'signal_new()'实例方法'self')。知道这可以帮助我清除你的误解。 – andlabs

回答

2

通用GObject信号不会通过GTK小部件树传播。只有事件相关的信号才能做到这一点,并且它在内部完成inside GTK

如果您希望递归发射信号,您必须添加一个函数,该函数在树中的每个小部件上调用g_signal_emit()

+0

哦,实际上是有道理的,所以对于传播是上面的例子,按钮和帧都应该通过连接到每个信号中来传递信号,然后使用'g_signal_emit'发送给它的父节点? – B8vrede

+1

这很奇怪,请记住:信号是同步的。如果您开始在信号内部发射信号,则可能会出现可扩展性灾难。我宁愿写我写的内容,并添加一个信号发射器函数,在内部进行层次遍历。另外,如果您向某个类添加信号并且想要将其发送到它的小部件的父级,则还需要将其添加到父级的类中。 – ebassi