2009-10-08 6 views
8

Я занимаюсь простой небольшой утилитой, изучая Python. Он динамически генерирует список кнопок:Определите, какая кнопка была нажата в Tkinter?

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. Какие-нибудь советы о том, как я могу сказать?

ответ

15

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

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}) 
1

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

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

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

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

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

+0

Я сделал второй метод, и он, кажется, делать то, что я хочу. Благодаря! – Sydius

+0

Если вы используете 'bind' вместо использования встроенного атрибута' command', вы теряете возможность использовать встроенную способность Tkinter для навигации и нажатия кнопок с помощью клавиатуры. Конечно, вы можете применить связку привязок для обработки всех особых случаев, но проще использовать атрибут 'command'. –

+0

@BryanOakley: действительно; ваше предложение об использовании лямбда намного чище. –

Смежные вопросы