Определить, какая кнопка была нажата в Tkinter? - PullRequest
9 голосов
/ 08 октября 2009

Я делаю простую маленькую утилиту, изучая Python. Он динамически генерирует список кнопок:

for method in methods:
    button = Button(self.methodFrame, text=method, command=self.populateMethod)
    button.pack({'fill': 'x', 'expand': 1, 'padx': 5, 'pady': 3})

Эта часть отлично работает. Однако мне нужно знать, какая из кнопок была нажата внутри self.populateMethod. Любой совет о том, как я мог бы сказать?

Ответы [ 2 ]

17 голосов
/ 09 октября 2009

Вы можете использовать лямбду для передачи аргументов в команду:

def populateMethod(self, method):
    print "method:", method

for method in ["one","two","three"]:
    button = Button(self.methodFrame, text=method, 
        command=lambda m=method: self.populateMethod(m))
    button.pack({'fill': 'x', 'expand': 1, 'padx': 5, 'pady': 3})
2 голосов
/ 08 октября 2009

Похоже, что в командный метод не передается ни один объект события.

Я могу придумать два обходных пути:

  • ассоциирует уникальный обратный вызов с каждой кнопкой

  • вызовите button.bind('<Button-1>', self.populateMethod) вместо передачи self.populateMethod как command. Затем self.populateMethod должен принять второй аргумент, который будет объектом события.

    Если предположить, что этот второй аргумент называется event, event.widget является ссылкой на кнопку, на которую нажали.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...