Вопрос-Ответ

Tkinter assign button command in a for loop with lambda [duplicate]

Tkinter назначает команду кнопки в цикле for с помощью lambda

Я пытаюсь создать несколько Buttons (с 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" и получение Test2 "Test2"), но когда я нажимаю кнопки, они обе печатают, "Test2" что означает, что они используют одну и ту же функцию с одним и тем же параметром.

Как я могу это решить?

Переведено автоматически
Ответ 1

Проблема заключается в вашем lambda выражении в for цикле. Он использует name переменную, но name переменная переназначается на каждой итерации for цикла, так что в итоге все кнопки получают последнее значение, которому name было присвоено в цикле for. Чтобы избежать этого, вы можете использовать параметры ключевого слова по умолчанию в вашем lambda выражении следующим образом:

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

Это привязывает текущее значение name переменной к name аргументу ключевого слова lambda каждый раз в цикле, производя желаемый эффект.

python tkinter