1

我在这里为 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,而按钮则不会收到信号。

有趣的是,预期的行为(点击按钮实际上点击它)发生在按钮,而不是动态添加和删除,在事件框的构造函数中添加一次,并且从未删除。

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

编辑:简而言之,我只得到“外部事件框被点击。”,但从来没有“内部小部件被点击。”。

更新:我提交了一个错误报告

4

1 回答 1

0

您需要使用 .set_above_child(false) 将 EventBox 事件窗口设置为低于其子级

这是它的文档:GtkEventBox

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

于 2013-03-07T18:20:25.313 回答