Комментарий , сделанный 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>
, когда вы покидаете виджет с помощью мыши.Это может быть то, что вы хотите, но это часто приводит к путанице.