2017-10-05 2 views
0

Je ne sais pas où je vais mal avec le dessous - Je suis sûr que c'est quelque chose de basique mais je ne sais toujours pas quel est le problème. J'essaie d'avoir un bouton pour changer la portée de la voiture quand on clique dessus, mais cela ne fera que régler le dernier.Python: lambdas dans une boucle for

def draw: 
     car_column = 0 
     for car in boarding_cars: 
      tk.Label(transport_frame, text="{}".format(car.name)).grid(row=0, column=car_column) 
      tk.Button(transport_frame, text=car.range, command= lambda: change_range(car)).grid(row=1, column=car_column) 
      car_column += 1 

    def change_range(car): 
     print car.name 
     if car.range == "mid": 
      car.range = "close" 
     elif car.range == "close: 
      car.range = "mid" 

Je comprends qu'il est tout simplement mise que le dernier dans la liste, mais je ne suis pas sûr comment arrêter le faire. Toute aide serait appréciée.

Répondre

2

Ceci est un problème courant lorsque les gens ne comprennent pas que lambda est en retard de liaison. Vous devez utiliser partial à la place pour cela.

from functools import partial 

tk.Button(transport_frame, text=car.range, command= partial(change_range, car)).grid(row=1, column=car_column) 
+1

Pour être clair, toutes les fermetures * * sont en retard contraignantes en Python, et pas seulement ceux créés avec 'lambda' –

+0

Je crains que je ne l'avais jamais entendu parler partiel - merci beaucoup! – Retro