Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Enter-Notify-Event Signal not working on gtk.ToolButton

On a happy (if not irrevelent) note, this is the absolute last obstacle in this particular project. If I fix this, I have my first significant dot release (1.0), and the project will be going public. Thanks to everyone here on SO for helping me through this project, and my other two (the answers help across the board, as they should).

Now, to the actual question...

I have a toolbar in my application (Python 2.7, PyGTK) which has a number of gtk.ToolButton objects on it. These function just fine. I have working "clicked" events tied to them.

However, I need to also connect them to "enter-notify-event" and "leave-notify-event" signals, so I can display the button's functions in the statusbar.

This is the code I have. I am receiving no errors, and yet, the status bar messages are not appearing:

new_tb = gtk.ToolButton(gtk.STOCK_NEW)
toolbar.insert(new_tb, -1)
new_tb.show()
new_tb.connect("clicked", new_event)
new_tb.connect("enter-notify-event", status_push, "Create a new, empty project.")
new_tb.connect("leave-notify-event", status_pop)

I know the issue is not with the "status_push" and "status_pop" events, as I've connected all my gtk.MenuItem objects to them, and they work swimmingly.

I know that gtk.ToolButton objects are in the Widgets class, so "enter-notify-event" and "leave-notify-event" SHOULD technically work. My only guess is that this particular object does not emit any signals other than "clicked", and thus I'd have to put each in a gtk.EventBox.

What am I doing wrong here? How do I fix this?

Thanks in advance!

like image 349
CodeMouse92 Avatar asked Sep 08 '11 17:09

CodeMouse92


2 Answers

Your guess was correct, you should wrap your widget in a gtk.EventBox, here is an example that i hope will be hopeful:

import gtk


def callback(widget, event, data):
    print event, data


class Win(gtk.Window):

    def __init__(self):
        super(Win, self).__init__()
        self.connect("destroy", gtk.main_quit)
        self.set_position(gtk.WIN_POS_CENTER)
        self.set_default_size(250, 200)

        tb = gtk.ToolButton(gtk.STOCK_NEW)
        # Wrap ``gtk.ToolButton`` in an ``gtk.EventBox``.
        ev_box = gtk.EventBox()
        ev_box.connect("enter-notify-event", callback, "enter")
        ev_box.connect("leave-notify-event", callback, "leave")
        ev_box.add(tb)

        self.add(ev_box)


if __name__ == '__main__':
    Win()
    gtk.main()
like image 138
mouad Avatar answered Nov 03 '22 07:11

mouad


It appears, based on experimentation and evidence, this is impossible in PyGtk 2.24.

like image 26
CodeMouse92 Avatar answered Nov 03 '22 06:11

CodeMouse92