Tkinter asignar botón de comando en bucle con lambda

Estoy tratando de crear unos cuantos botones (con un for) así:

def a(self, name): print name users = {"Test":"127.0.0.0", "Test2":"128.0.0.0"} row = 1 for name in users: user_button = Tkinter.Button(self.root, text=name, command=lambda: self.a(name)) user_button.grid(row = row, column = 0) row+=1 

y para que los botones obtengan cada uno su propio parámetro (Prueba obteniendo Prueba y Prueba2 obteniendo Prueba2) pero cuando presiono los botones ambos imprimen “Prueba2”, lo que significa que están usando la misma función con el mismo parámetro.

¿Como puedo resolver esto?

El problema es tu lamba en el bucle for. Su lambda está usando la variable de name , pero la variable de name se reasigna cada vez que pasa por el bucle for. Así que al final, todos los botones obtienen el último valor al que se asignó el name en el bucle for. Para evitar esto, puede usar los parámetros de palabras clave predeterminados en su expresión lamba así:

 user_button = Tkinter.Button(self.root, text=name, command=lambda name=name: self.a(name)) 

Esto une el valor actual de la variable de name argumento de la palabra clave de name lamba cada vez que pasa por el bucle, produciendo el efecto deseado.