Найти - Пользователи
Полная версия: Не могу привязать обработку событий: странное поведение метода 'bind'
Начало » Python для новичков » Не могу привязать обработку событий: странное поведение метода 'bind'
1
Alex.Pro.
Приветствую всех.
Имею пьяного Пайтона 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’, а к таблице, почему-то, второй обработчик привязать не могу. Кто-нибудь сможет раз'яснить где я затупил и как мне победить эту проблему?
py.user.next
Аргумент надо принимать в самой лямбда-функции. Обычно во многих языках в обработчики событий передаются сами эти события.

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

Спасибо за попытку. Но в предложенном Вами варианте ни функция не вызывается, ни сообщений об ошибках нет. Как будто строка просто игнорируется. Кроме того, изначально в сообщении об ошибке говорилось что лямбда уже получает больше аргументов, чем требуется.
py.user.next
Alex.Pro.
Как будто строка просто игнорируется.
Значит, функция Fn_Add_Data() написана неправильно. Она вызывается, но не срабатывает так, как задумано.

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

  
def f():
    print('f')
 
tblDom.bind('<Return>', lambda event: f())
Alex.Pro.
py.user.next
Значит, функция Fn_Add_Data() написана неправильно. Она вызывается, но не срабатывает так, как задумано.
Не согласен. Хотя, в принципе, Вы правы. Эта функция написана правильно и срабатывает как задумывалось. Только она задумывалась не для вывода чего-либо на экран, а для записи данных в БД, без лишних сообщений. Я затупил и пытался привязать не ту функцию! Поэтому и не увидел когда привязка сработала. Сменил функцию на Fn_Ed_Data() и увидел что Ваш вариант, действительно, работает.
Большое спасибо за помощь!
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB