Получение виджета, который вызвал событие?
в Tkinter у меня есть несколько виджетов, привязанных к левой кнопке мыши. Все они запускают одно и то же событие при нажатии.
Как восстановить, какой виджет был нажат?
Я хочу, чтобы это так, когда говорят Label2
был нажат, я бы смог восстановить это Label2
был виджет, который был нажат в событии, которое он вызвал.
3 ответов
похоже, что все ваши виджеты совместно используют обработчик событий. Этот отрывок из Tkinter 8.4 Ссылка John W. Shipman-Nm Tech, может помочь.
30.7. Дополнительные аргументы trick
иногда вы хотели бы передать другим аргументы обработчику помимо событие.
вот пример. Предположим, ваш приложение имеет массив из десяти кнопки checkbuttons, виджеты которых хранятся в списке
self.cbList
, индексируется количество checkbutton вrange(10)
.предположим далее, что вы хотите написать один обработчик по имени
.__cbHandler
для<Button-1>
события во всех десяти эти checkbuttons. Обработчик может получить фактическийCheckbutton
виджет это вызвало его, ссылаясь на наEvent
объект, который передается, но как он узнает, что checkbutton индекс вself.cbList
?было бы неплохо написать нашему хендлеру с дополнительным аргументом в пользу checkbutton номер, что-то вроде это:
def __cbHandler ( self, event, cbNumber ):
но обработчики событий передаются только один спор, событие. Поэтому мы не можем использовать функция выше из-за a несоответствие по количеству аргументов.
к счастью, способность 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
объект передан всем событиям обработчики, и второй и третий аргументы будут установлены по умолчанию ценности?дополнительные аргументы надо передавать его.этот метод можно расширить к поставьте любое количество дополнительного аргументы обработчикам.
немного более краткий способ сделать это, как это делает Брайан Оукли для второй кнопки в ответ, определить каждую функцию обработчика в линии с лямбда, т. е.:
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 )
cb.bind ( "<Button-1>", lambda event, self=self, i=i:
self.__cbHandler( event, i ) )
?
def __cbHandler ( self, event, cbNumber ):
?