Как связать все виджеты фреймов с событием <'Enter'> - PullRequest
0 голосов
/ 27 ноября 2018

В следующем коде я хочу привязать все элементы frame1 к событию <'Enter'>, но это не работает.Я имею в виду canvas.focus_set () не вступает в силу.Как я могу решить мою проблему?

for w in frame1.winfo_children():
    w.bind('<Enter>',canvas1.focus_set())

Ответы [ 3 ]

0 голосов
/ 27 ноября 2018

Комментарий , сделанный Lafexlos , фактически направляет вас в правильном направлении.Когда вы делаете

w.bind('<Enter>', canvas1.focus_set())

, вы вызываете canvas1.focus_set() и используете возвращаемое значение этого вызова функции (то есть None) для привязки к событию.Это не то, что вам нужно, потому что теперь каждый раз, когда событие срабатывает, вместо canvas1.focus_set() выполняется None.

Что вам нужно сделать, это передать ссылку на функцию bind.Ссылка для вызова canvas1.focus_set() является canvas1.focus_set.Однако использование

w.bind('<Enter>', canvas1.focus_set)

по-прежнему не работает.
Это происходит потому, что функция bind передает объект события в функцию, которую ей дали, поэтому она будет вызывать canvas1.focus_set(event) вместоcanvas1.focus_set().Поскольку focus_set не принимает никаких аргументов, это терпит неудачу.

Вы можете исправить это двумя способами.Вы можете создать дополнительную функцию, которая принимает объект события и затем вызывает canvas1.focus_set() без аргументов, а затем связывает событие с этой новой функцией.Другой вариант - использовать анонимную функцию «лямбда», чтобы сделать то же самое, как

w.bind('<Enter>', lambda e: canvas1.focus_set())

Таким образом, функция лямбда принимает объект события как e, но не передает его focus_set.


PS Событие <Enter> - это , а не событие, которое вызывается при нажатии кнопки Enter на клавиатуре (то есть * 1039).*).Событие <Enter> вызывается всякий раз, когда вы перемещаете мышь на виджет, и сопровождается событием <Leave>, когда вы покидаете виджет с помощью мыши.Это может быть то, что вы хотите, но это часто приводит к путанице.

0 голосов
/ 27 ноября 2018

с помощью canvas1.bind_all, который является родителем frame1, я решил мою проблему.Спасибо за все решения.

0 голосов
/ 27 ноября 2018

Если я вижу, что вы допустили какую-либо ошибку, скорее всего, вы не вызываете команду записи для клавиши Enter.Надеюсь, если вы пытаетесь сделать это в Windows, вам лучше использовать Return.

Больше похоже на:

for w in frame1.winfo_children():
    w.bind('<Return>',canvas1.focus_set())
...