Tkinter asigna el comando del botón en un bucle for con lambda [duplicado]

Resuelto Shay asked hace 11 años • 1 respuestas

Estoy intentando crear algunos Buttons (con un forbucle) 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 cada uno de los botones obtenga su propio parámetro (obtención de prueba "Test"y obtención de prueba2 "Test2"), pero cuando presiono los botones, ambos imprimen, "Test2"lo que significa que están usando la misma función con el mismo parámetro.

¿Como puedo resolver esto?

Shay avatar Jul 16 '13 20:07 Shay
Aceptado

El problema es tu lambdaexpresión en el forbucle. Está utilizando la namevariable, pero la namevariable se reasigna en cada iteración del forbucle, por lo que al final, todos los botones obtienen el último valor nameasignado en el bucle for. Para evitar esto, puede utilizar parámetros de palabras clave predeterminados en su lambdaexpresión de esta manera:

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

Esto vincula el valor actual de la namevariable al argumento de la palabra clave lambda namecada vez que pasa por el bucle, produciendo el efecto deseado.

mshildt avatar Jul 16 '2013 13:07 mshildt