自定义信号不传播

时间:2016-03-01 14:35:56

标签: python python-2.7 gtk gtk3 gobject

对于我正在研究的项目,我使用在孩子身上发出的自定义信号,然后在信号未完全处理时传播给父母。

基于我可以发现的信息,似乎没有连接处理程序(使用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")

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

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

1 个答案:

答案 0 :(得分:2)

通用GObject信号不会通过GTK小部件树传播。只有与事件相关的信号才会这样做,而且它是在内部完成的inside GTK

如果希望以递归方式发出信号,则必须在树中的每个小部件上添加一个调用g_signal_emit()的函数。