Gtk3:从EventBox动态添加和删除按钮:按钮不会接收鼠标按键信号

时间:2013-03-07 17:18:24

标签: python gtk gtk3 pygobject

我在这里为Gtk 3使用python和PyGObjects(内省库)。

请考虑以下代码:

from gi.repository import Gtk

class InternalWidget(Gtk.Button):
    def __init__(self):
        super(InternalWidget, self).__init__()
        self.set_size_request(100,100)
        self.connect("button-press-event", self.on_press)

    def on_press(self, *args):
        print "The Internal Widget was clicked."


class ExternalEventBox(Gtk.EventBox):
    def __init__(self):
        super(ExternalEventBox, self).__init__()
        self.fixed = Gtk.Fixed()
        self.add(self.fixed)
        self.internal_widget = InternalWidget()
        self.set_size_request(200, 200)
        self.connect("button-press-event", self.on_press)
        self.connect("enter-notify-event", self.on_enter)
        self.connect("leave-notify-event", self.on_leave)

    def on_enter(self, *args):
        self.fixed.put(self.internal_widget, 50,50)
        self.show_all()

    def on_leave(self, *args):
        self.fixed.remove(self.internal_widget)

    def on_press(self,*args):
        print "The External Event Box was clicked."

w = Gtk.Window(Gtk.WindowType.TOPLEVEL)
w.connect("delete-event", Gtk.main_quit)
w.add(ExternalEventBox())
w.show_all()
Gtk.main()

在上面,只要鼠标进入ExternalEventBox,就会在孩童时添加一个按钮(InternalWidget)。当鼠标离开ExternalEventBox时,该按钮将作为ExternalEventBox的子项删除。

现在,如果你运行代码(你可以),按钮就会出现并正确消失。但是,与预期相反,单击按钮仅向包含ExternalEventBox的信号发送信号,而按钮不接收信号。

有趣的是,当在事件框的构造函数中添加按钮而不是动态添加和删除按钮时,预期行为(单击按钮实际上会单击它)会发生,并且永远不会被删除。

这是一个错误,还是我错过了什么?

编辑:简而言之,我只获得“点击了外部事件框。”,但从未“点击内部窗口小部件。”。

更新:我提交了bug report

1 个答案:

答案 0 :(得分:0)

您需要使用.set_above_child(false)

将EventBox事件窗口设置为低于它的子项

以下是文档:GtkEventBox

  

如果窗口在上方,则事件框内的所有事件都将转到事件框。如果窗口在下面,则子窗口小部件的窗口中的事件将首先进入该窗口小部件,然后到达其父窗口。