2009-10-08 157 views
8

Estoy haciendo una pequeña utilidad simple mientras aprendo Python. Genera dinámicamente una lista de botones:¿Determinar qué botón se presionó en Tkinter?

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

Esa parte funciona bien. Sin embargo, necesito saber cuál de los botones se presionó dentro de self.populateMethod. ¿Algún consejo sobre cómo podría contar?

Respuesta

15

Puede utilizar lambda para pasar argumentos a un comando:

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

Parece que el método de comando no pasa ningún objeto de evento.

me ocurren dos soluciones:

  • asociada una devolución de llamada única para cada botón

  • llamada button.bind('<Button-1>', self.populateMethod) en lugar de pasar self.populateMethod como command. self.populateMethod debe aceptar un segundo argumento que será un objeto de evento.

    Suponiendo que este segundo argumento se llama event, event.widget es una referencia al botón que se hizo clic.

+0

lo hice el segundo método y parece que hacer lo que quiero. ¡Gracias! – Sydius

+0

Si usa 'bind' en lugar de aprovechar el atributo' command' incorporado, pierde la capacidad de usar la habilidad incorporada de Tkinter para navegar y hacer clic en los botones con el teclado. Por supuesto, puede aplicar un conjunto de enlaces para manejar todos los casos especiales, pero es más fácil simplemente usar el atributo 'command'. –

+0

@BryanOakley: de hecho; tu sugerencia de usar lambdas es mucho más limpia. –

Cuestiones relacionadas