Take the 2-minute tour ×

In the pygtk reference it states that every Gtk.Widget has the event enter-event-notify, but with my test code that event is never fired for the Label widget (with others it has worked).

Is there something I should do differently?

import pygtk
import gtk

class LabelTest:

        return False

    def destroy(self, widget, data=None):

    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.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


    def main(self):

if __name__ == "__main__":
    test = LabelTest()
share|improve this question
add comment

2 Answers

up vote 7 down vote accepted

There are certain widgets that don't own a X-window of their own for performance reasons ,since they are mostly decorative an generally don't need to handle X event signals. You can find a complete list here.

In those cases, a GtkEventBox is recommended to wrap the windowless widget with(the EventBox was build with that objective specifically).

share|improve this answer
add comment

OK I've got the solution, it's the same as over here: Enter-Notify-Event Signal not working on gtk.ToolButton. For some non-obvious reason some widgets can't respond to signals on their own and need an extra box around them. I've rewritten the code example in a way I would have done it - namely using imports for more recent GTK 3.0 and a more object oriented style by deriving from Gtk.Window. Also one might prefer instance methods instead of nested ones.

from gi.repository import Gtk

class Foo (Gtk.Window):

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

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

    def main(self):

if __name__ == "__main__":
share|improve this answer
add comment

Your Answer


