Получение виджета, который вызвал событие?

в Tkinter у меня есть несколько виджетов, привязанных к левой кнопке мыши. Все они запускают одно и то же событие при нажатии.

Как восстановить, какой виджет был нажат?

Я хочу, чтобы это так, когда говорят Label2 был нажат, я бы смог восстановить это Label2 был виджет, который был нажат в событии, которое он вызвал.

3 ответов


def f(event):
    caller = event.widget

у вас есть несколько вариантов. Один из способов-получить доступ к


похоже, что все ваши виджеты совместно используют обработчик событий. Этот отрывок из 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 ):
    ?