2017-10-05 4 views
0

私はどこが間違っているのかわかりません - 基本的なものだと確信していますが、問題は何かまだわかりません。私はボタンをクリックすると車の範囲を変更しようとしているが、それは最後のものだけを設定する。Python:forループのlambdas

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" 

私はリストの最後のものとしてすべてを設定していることを理解していますが、それをやめる方法はわかりません。どんな助けもありがとう。

答えて

2

これは、人々がlambdaがレイトバインディングであることを理解していない場合によくある問題です。代わりにpartialを使用する必要があります。

from functools import partial 

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

ただ明確にするために、* *は、Pythonで、後半に結合されているすべての閉鎖だけでなく、私は私が部分のことを聞いたことがなかったんですlambda' –

+0

'で作成されたもの - のおかげでそんなに! – Retro

関連する問題