Иерархическая пересылка событий в Tk - PullRequest
1 голос
/ 10 июля 2020

предположим, что у меня есть следующая иерархия виджетов:

set Frame  [frame .f -relief flat]
set Button [button .f.b1]

Кроме того, если я хочу подражать button виджету -overrelief, выполнив следующие действия:

# When the mouse hovers over Frame
bind $Frame <Enter> "$Frame configure -relief groove"

# When it exits
bind $Frame <Leave> "$Frame configure -relief flat"

Проблема заключается в том, что $Button каким-то образом нарушает эту «цепочку распространения», т.е. событие <Enter> не достигает $Frame, а не . Есть ли лекарство или это присущее Tk поведение?

EDIT:

Приведенный выше пример работает, если указатель (Mouse) касается внешней границы, а затем запускает событие <Enter>, но проблема остается , следующая модификация кода лучше всего иллюстрирует это:

#When the pointer is inside the frame widget, print x,y (as relative to the widget)
bind .f <Motion> {puts {%x %y}}

puts вызывается только тогда, когда указатель находится на края рамки, не внутри самой рамки.

1 Ответ

1 голос
/ 12 июля 2020

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

Используя ваш пример кода, изменение рельефа не видно, потому что рамка имеет ширину границы по умолчанию, равную 0. Поэтому вам нужно будет указать ширину границы 2 или около того.

Вот полный сценарий, который работает для меня как вы, кажется, хотите:

set Frame  [frame .f -relief flat -borderwidth 2]
set Button [button .f.b1]
grid $Frame
grid $Button

# When the mouse hovers over Frame
bind $Frame <Enter> [list $Frame configure -relief groove]

# When it exits
bind $Frame <Leave> [list $Frame configure -relief flat]

Событие действительно не передается фрейму. Если вы хотите, чтобы это тоже произошло, вы можете добавить фрейм в теги привязки кнопки:

bindtags $Button [linsert [bindtags $Button] 1 $Frame]

Это заставит любое событие на кнопке также запускать привязки кадров, если это специально не предотвращается привязками кнопок .

Когда это установлено, события и кадра фактически запускаются дважды при прямом нажатии кнопки. Один раз из-за события в самом кадре, а в другой раз из-за тегов привязки кнопки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...