Обнаружить выход мыши из окна pygtk

В приложении PyGTK я хотел бы определить, когда указатель мыши покидает окно верхнего уровня.

window = gtk.Window(gtk.WINDOW_TOPLEVEL)
...
window.connect("leave-notify-event", window_exit, "")

Однако этот обратный вызов запускается только тогда, когда мышь входит в виджет в окне, а не когда он покидает окно верхнего уровня?


person OJW    schedule 10.01.2012    source источник


Ответы (1)


Ваша проблема в том, что когда указатель входит в подчиненный виджет, в GTK он технически также покидает окно, что является причиной странного поведения, которое вы испытываете. (Кстати, у меня совершенно нет опыта работы с python, но я постараюсь сделать его понятным)

Голова вашей функции обратного вызова должна выглядеть примерно так:

def window_exit(widget, event, user_data)

Событие очень важно, потому что его переменная 'event.detail' точно сообщает нам, какое событие произошло. В вашем случае вы хотите проверить, равен ли он «gtk.gdk.NOTIFY_NONLINEAR», потому что это означает, что указатель «действительно» покинул окно.

Итак, вы, вероятно, должны поставить что-то вроде

if (event.detail != gtk.gdk.NOTIFY_NONLINEAR)  { return; }

в верхней части вашей функции обратного вызова. (Синтаксис может быть не совсем правильным, так как я не знаю Python)

person Ancurio    schedule 10.01.2012
comment
Хорошо, у меня не было бы проблем с игнорированием случаев, когда он переходит в низший виджет. Однако функция обратного вызова вообще не вызывается, когда мышь покидает окно верхнего уровня (по крайней мере, в Windows XP) - person OJW; 10.01.2012
comment
@OJW О, извините, у меня это сработало в Linux .. может быть, тогда это ошибка? - person Ancurio; 10.01.2012