Tkinter asigna el comando del botón en un bucle for con lambda [duplicado]
Estoy intentando crear algunos Button
s (con un for
bucle) 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?
El problema es tu lambda
expresión en el for
bucle. Está utilizando la name
variable, pero la name
variable se reasigna en cada iteración del for
bucle, por lo que al final, todos los botones obtienen el último valor name
asignado en el bucle for. Para evitar esto, puede utilizar parámetros de palabras clave predeterminados en su lambda
expresió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 name
variable al argumento de la palabra clave lambda name
cada vez que pasa por el bucle, produciendo el efecto deseado.