tkinter TypeError: list indices must be integers or slices, not Event

Skatoro

Новичок
Пользователь
Дек 26, 2020
7
0
1
Windows 10
Python 3.9

Пытаюсь передать в функцию rbtn_click, значение флажка на кнопке(нажата она или нет, строка 134), в случае с лкм, которая прописана с помощью command - все работает(строка 133), а если передавать через лямбду(строка 135), при нажатии ПКМ выдает ошибку, вызывая функцию rbtn_click.
Чтобы войти в игру - выбирайте любой уровень сложности и сохранение, не вписывая логин и пароль.

 
Последнее редактирование:

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
tkinter TypeError: list indices must be integers or slices, not Event
Ошибка возникает потому, что при клике на кнопку в функцию передается объект Event, который в параметрах не учитывается.
Объект Event записывается в параметр y и при обращении к кнопке btn[y][x] возникает TypeError.
Чтобы исправить можно добавить переменную для Event в лямбду и в параметры функции rbtn_click:
- заменить строку
Python:
btn[i][j].bind("<Button-3>", lambda y=i, x=j: rbtn_click(x, y, btn, height, width))
на такую
Python:
btn[i][j].bind("<Button-3>", lambda e, y=i, x=j: rbtn_click(x, y, btn, height, width, e=e))
и в функцию добавить аргумент
Python:
def rbtn_click(x, y, btn, height, width, e=None):
Также советую переписать код на ООП (классы и фреймы) - это позволит лучше в нем ориентироваться и избавит от необходимости использовать глобальные переменные.
 
  • Мне нравится
Реакции: Skatoro

Skatoro

Новичок
Пользователь
Дек 26, 2020
7
0
1
Ошибка возникает потому, что при клике на кнопку в функцию передается объект Event, который в параметрах не учитывается.
Объект Event записывается в параметр y и при обращении к кнопке btn[y][x] возникает TypeError.
Чтобы исправить можно добавить переменную для Event в лямбду и в параметры функции rbtn_click:
- заменить строку
Python:
btn[i][j].bind("<Button-3>", lambda y=i, x=j: rbtn_click(x, y, btn, height, width))
на такую
Python:
btn[i][j].bind("<Button-3>", lambda e, y=i, x=j: rbtn_click(x, y, btn, height, width, e=e))
и в функцию добавить аргумент
Python:
def rbtn_click(x, y, btn, height, width, e=None):
Также советую переписать код на ООП (классы и фреймы) - это позволит лучше в нем ориентироваться и избавит от необходимости использовать глобальные переменные.
Спасибо. Я только начал разбираться в ООП, в следующий раз попробую использовать классы и фреймы.
 

Форум IT Специалистов