Похоже, что все ваши виджеты используют общий обработчик событий. Эта выдержка из Tkinter 8.4 Reference Джона У. Шипмана - NM Tech, может помочь.
30,7. Трюк с дополнительными аргументами
Иногда вы хотели бы передать другим
аргументы обработчику помимо
событие.
Вот пример. Предположим, ваш
приложение имеет массив из десяти
флажки, чьи виджеты хранятся
в списке self.cbList
, проиндексированном
номер кнопки в range(10)
.
Предположим, что вы хотите написать
один обработчик с именем .__cbHandler
для
<Button-1>
событий во всех десяти
эти кнопки проверки. Обработчик может
получить актуальный Checkbutton
виджет
что вызвало его, ссылаясь на
.widget
атрибут Event
объект, который передается, но как
он узнает, что кнопка проверки
индекс в self.cbList
?
Было бы неплохо написать наш обработчик
с дополнительным аргументом для
номер кнопки, что-то вроде
это:
def __cbHandler ( self, event, cbNumber ):
Но обработчики событий передаются только одному
аргумент, событие. Поэтому мы не можем использовать
функция выше из-за
несоответствие количества аргументов.
К счастью, способность Python
предоставить значения по умолчанию для функции
аргументы дают нам выход. Есть
посмотрите на этот код:
def __createWidgets ( self ):
?
self.cbList = [] # Create the checkbutton list
for i in range(10):
cb = Checkbutton ( self, ? )
self.cbList.append ( cb )
cb.grid( row=1, column=i )
def handler ( event, self=self, i=i ): # [1]
return self.__cbHandler ( event, i )
cb.bind ( "<Button-1>", handler )
?
def __cbHandler ( self, event, cbNumber ):
?
#
[1] Эти строки определяют новую функцию
handler
, который ожидает три
аргументы. Первый аргумент
Event
объект передан всему событию
обработчики, а второй и третий
аргументы будут установлены по умолчанию
значения? дополнительные аргументы нам нужно
передать его.
Эта техника может быть расширена до
поставьте любое количество дополнительных
аргументы обработчикам.
Несколько более краткий способ сделать это, как Брайан Оукли для второй кнопки в , его ответ , состоит в том, чтобы определить каждую функцию-обработчик в ряд с лямбда-выражением, т.е.