3

在 pygtk 参考中,它声明每个Gtk.Widget都有事件enter-event-notify,但是在我的测试代码中,该事件从未为 Label 小部件触发(与其他小部件一起工作)。

有什么我应该做的不同的事情吗?

import pygtk
pygtk.require('2.0')
import gtk

class LabelTest:

    def delete_event(self, widget, event, data=None):
        return False

    def destroy(self, widget, data=None):
        gtk.main_quit()

    def __init__(self):
        self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)

        self.window.connect("delete_event", self.delete_event)
        self.window.connect("destroy", self.destroy)
        self.window.set_border_width(10)

        self.label = gtk.Label("A label")

        # question section
        def labelMouseOver(w, data=None):
          print "mouse over"

        self.label.connect('enter-notify-event', labelMouseOver, None)
        # /question section

        self.window.add(self.label)
        self.label.show()
        self.window.show()

    def main(self):
        gtk.main()

if __name__ == "__main__":
    test = LabelTest()
    test.main()
4

2 回答 2

9

由于性能原因,某些小部件不拥有自己的 X 窗口,因为它们大多是装饰性的,通常不需要处理 X 事件信号。您可以在此处找到完整列表。

在这些情况下,建议使用GtkEventBox来包装无窗口小部件(EventBox 是专门使用该目标构建的)。

于 2013-01-13T03:35:26.037 回答
2

好的,我找到了解决方案,和这里的一样:Enter-Notify-Event Signal not working on gtk.ToolButton。由于某些非显而易见的原因,一些小部件无法自行响应信号,因此需要在它们周围放置一个额外的框。我已经以一种我会做的方式重写了代码示例 - 即为更新的 GTK 3.0 使用导入,并通过从Gtk.Window. 也有人可能更喜欢实例方法而不是嵌套方法。

from gi.repository import Gtk

class Foo (Gtk.Window):

    def __init__(self):
        Gtk.Window.__init__(self)
        self.connect("destroy", Gtk.main_quit)
        self.set_border_width(50)
        box = Gtk.EventBox()
        label = Gtk.Label("Test")   
        box.add(label)
        box.connect("enter-notify-event", self.on_mouse)
        self.add(box)
        self.show_all()

    def on_mouse(self, widget, data=None):
        print widget, data

    def main(self):
        Gtk.main()

if __name__ == "__main__":
    Foo().main()
于 2013-01-13T00:04:29.790 回答