Сигнал Enter-Notify-Event не работает на gtk.ToolButton - PullRequest
4 голосов
/ 08 сентября 2011

На счастливой (если не на почтительной) ноте это абсолютное последнее препятствие в этом конкретном проекте. Если я исправлю это, у меня появится первая значительная версия (1.0), и проект станет общедоступным. Спасибо всем здесь, на SO, за помощь мне в этом проекте, и моим двум другим (ответы помогают по всем направлениям, как они должны).

Теперь к актуальному вопросу ...

В моем приложении есть панель инструментов (Python 2.7, PyGTK), на которой есть несколько объектов gtk.ToolButton. Эти функции просто отлично. У меня работают связанные с ними "кликнувшие" события.

Однако мне нужно также подключить их к сигналам "enter-notify-event" и "left-notify-event", чтобы я мог отобразить функции кнопки в строке состояния.

Это код, который у меня есть. Я не получаю ошибок, но сообщения о статусе не отображаются:

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)

Я знаю, что проблема не в событиях "status_push" и "status_pop", поскольку я подключил к ним все свои объекты gtk.MenuItem, и они работают плавно.

Я знаю, что объекты gtk.ToolButton находятся в классе Widgets, поэтому "enter-notify-event" и "exit-notify-event" ДОЛЖНЫ технически работать. Мое единственное предположение состоит в том, что этот конкретный объект не испускает никаких сигналов, кроме "clicked", и, таким образом, я должен поместить каждый в gtk.EventBox.

Что я здесь не так делаю? Как мне это исправить?

Заранее спасибо!

Ответы [ 2 ]

3 голосов
/ 08 сентября 2011

Ваше предположение было верным, вы должны обернуть ваш виджет в gtk.EventBox, вот пример, который, я надеюсь, будет полон надежд:

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()
2 голосов
/ 21 ноября 2011

По-видимому, основываясь на экспериментах и ​​доказательствах, это невозможно в PyGtk 2.24.

...