对于我正在研究的项目,我使用在孩子身上发出的自定义信号,然后在信号未完全处理时传播给父母。
基于我可以发现的信息,似乎没有连接处理程序(使用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 :(得分:2)
通用GObject信号不会通过GTK小部件树传播。只有与事件相关的信号才会这样做,而且它是在内部完成的inside GTK。
如果希望以递归方式发出信号,则必须在树中的每个小部件上添加一个调用g_signal_emit()
的函数。