Уведомления

Группа в Telegram: @pythonsu

#1 Ноя. 16, 2024 22:28:59

Alex.Pro.
От: Марик
Зарегистрирован: 2024-11-13
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Не могу привязать обработку событий: странное поведение метода 'bind'

Приветствую всех.
Имею пьяного Пайтона 3.8.10 на Win7. Пытаюсь сделать программку для своих нужд. Столкнулся с проблемой, которую не могу ни решить, ни обойти. Вот фрагмент проблемного кода:

 # во вкладке создаём таблицу с отображением заголовков
tblDom = ttk.Treeview(tabDom, columns=list(headers.keys()))
ColWidth = int(tabDom.winfo_width() / len(headers.items()))     # Ширина столбца = ширина окна/количество заголовков
for column, name in headers.items():                    # Для каждой колонки
    tblDom.heading(column, anchor=CENTER, text=name)      # определяем заголовки
    tblDom.column(column, anchor=CENTER, stretch=True, width=ColWidth)      #настраиваем колонки
tblDom.bind('<Button-1>', Fn_TablSort)                # Клик по заголовку вызывает сортировку по колонке
tblDom.bind('<Return>', lambda: Fn_Add_Data(), '+')
Дальше прикручивается скроллбар, таблица пакуется, заполняется данными и т.д. и т.п. и пр. и пр… Всё работает нормально, кроме… Первый бинд нормально привязал к таблице обработку левого клика, таблица сортируется правильно когда требуется. А второй бинд… Без лямбды функция вызывается сразу при старте программы, не дожидаясь никаких кликов или тапов. С лямбдой, при наступлении события, получаю ошибку:
"TypeError: <lambda>() takes 0 positional arguments but 1 was given"
Причём ситуация не зависит ни от наличия плюсика в привязке, ни от порядка привязок.
Ко всем кнопкам функции обработки кликов через лямбду успешно привязаны методом ‘config’, а к таблице, почему-то, второй обработчик привязать не могу. Кто-нибудь сможет раз'яснить где я затупил и как мне победить эту проблему?

Офлайн

#2 Ноя. 16, 2024 22:39:44

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9842
Репутация: +  853  -
Профиль   Отправить e-mail  

Не могу привязать обработку событий: странное поведение метода 'bind'

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

Alex.Pro.
  
tblDom.bind('<Return>', lambda: Fn_Add_Data(), '+')
Прими событие в лямбде
  
tblDom.bind('<Return>', lambda event: Fn_Add_Data())



Отредактировано py.user.next (Ноя. 16, 2024 22:42:51)

Офлайн

#3 Ноя. 16, 2024 23:27:57

Alex.Pro.
От: Марик
Зарегистрирован: 2024-11-13
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Не могу привязать обработку событий: странное поведение метода 'bind'

py.user.next
Прими событие в лямбде
tblDom.bind('<Return>', lambda event: Fn_Add_Data())

Спасибо за попытку. Но в предложенном Вами варианте ни функция не вызывается, ни сообщений об ошибках нет. Как будто строка просто игнорируется. Кроме того, изначально в сообщении об ошибке говорилось что лямбда уже получает больше аргументов, чем требуется.

Отредактировано Alex.Pro. (Ноя. 16, 2024 23:28:35)

Офлайн

#4 Ноя. 16, 2024 23:41:05

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9842
Репутация: +  853  -
Профиль   Отправить e-mail  

Не могу привязать обработку событий: странное поведение метода 'bind'

Alex.Pro.
Как будто строка просто игнорируется.
Значит, функция Fn_Add_Data() написана неправильно. Она вызывается, но не срабатывает так, как задумано.

Чтобы определить, вызывается функция или нет, можешь вместо этой функции вызвать функцию f(), которая выводит что-нибудь в консоль.

  
def f():
    print('f')
 
tblDom.bind('<Return>', lambda event: f())



Офлайн

#5 Ноя. 17, 2024 00:32:34

Alex.Pro.
От: Марик
Зарегистрирован: 2024-11-13
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Не могу привязать обработку событий: странное поведение метода 'bind'

py.user.next
Значит, функция Fn_Add_Data() написана неправильно. Она вызывается, но не срабатывает так, как задумано.
Не согласен. Хотя, в принципе, Вы правы. Эта функция написана правильно и срабатывает как задумывалось. Только она задумывалась не для вывода чего-либо на экран, а для записи данных в БД, без лишних сообщений. Я затупил и пытался привязать не ту функцию! Поэтому и не увидел когда привязка сработала. Сменил функцию на Fn_Ed_Data() и увидел что Ваш вариант, действительно, работает.
Большое спасибо за помощь!

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version