0

I'm unsure where I'm going wrong with the below - I'm sure it's something basic but I'm still a bit unsure what the issue is. I'm trying to have a button change the range of the car when clicked, but it will only set the last one.

    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"

I understand it's just setting everything as the last one in the list, but I'm unsure how to stop it doing that. Any help would be appreciated.

Retro
  • 130
  • 16

1 Answers1

2

This is a common problem when people don't understand that lambda is late-binding. You need to use partial instead for this.

from functools import partial

tk.Button(transport_frame, text=car.range, command= partial(change_range, car)).grid(row=1, column=car_column)
Novel
  • 13,406
  • 2
  • 25
  • 41