Я пытался использовать кнопки графического интерфейса в Tkinter и столкнулся с проблемой при их использовании. Этот код должен (по крайней мере, я ожидал) генерировать несколько кнопок, которые при нажатии распечатывают отображаемую букву. Однако независимо от того, какая кнопка нажата, всегда выводится результат последней сгенерированной кнопки. Есть ли другой способ использования подобных функций?
import tkinter
win = tkinter.Tk()
players = ["A","B","C","D"]
for p in players:
playerBtn = tkinter.Button(win,text=p,command=lambda : print(p))
playerBtn.pack()
tkinter.mainloop()






Это происходит потому, что lambda - это просто поиск глобальной стоимости p. Чтобы изменить это, мы сделаем следующее -
import tkinter
win = tkinter.Tk()
players = ["A","B","C","D"]
for p in players:
player_button = tkinter.Button(win, text=p, command=lambda button_text=p: print(button_text))
player_button.pack()
tkinter.mainloop()
Протестировал это на Ubuntu 18.04, и он работает так, как вы хотите.
Вы можете обратиться к сообщению это SO для получения более подробной информации об этом поведении.