39

私はいくつかButtonの s (forループ付き) を次のように作成しようとしています:

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

ボタンはそれぞれ独自のパラメーターを取得します (Test 取得"Test"と Test2 取得"Test2") が、ボタンを押すと両方が印刷"Test2"されます。これは、同じパラメーターで同じ関数を使用していることを意味します。

どうすればこれを解決できますか?

4

1 に答える 1

58

問題は、ループ内lambdaの式です。for変数を使用していnameますが、name変数はループの反復ごとに再割り当てされるため、最終的にはすべてのボタンがfor ループで割り当てられforた最後の値を取得します。これを回避するには、次のように式nameでデフォルトのキーワード パラメータを使用できます。lambda

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

これにより、変数の現在の値がループのたびnameにラムダのキーワード引数にバインドされ、目的の効果が得られます。name

于 2013-07-16T13:24:43.650 に答える