每当我通过循环在tkinter中动态创建按钮时,就会通过循环调用具有为其分配值的函数,如下所示:
from tkinter import *
root=Tk()
def add(text):
print(text)
for i in ('a', 'b', 'c'):
Button(root, text=i, command=lambda:add(i)).pack()
mainloop()
我总是遇到这样的问题:无论我按什么按钮,都用循环中的最后一个值调用该函数。在这种情况下,它只打印我按下的任何按钮c
。我不知道这是lambda
还是tkinter
还是仅仅是我的编程问题,但是我想知道如何解决它。
我尝试使用copy.copy
,copy.deepcopy
(在lambda
函数和字符串上)以及[:]
和str
(在字符串上)。
答案 0 :(得分:4)
有一个常见的窍门:
for i in ...:
def command(i=i):
add(i)
Button(..., command=command)
看起来有点难看,但是它会在默认参数值中捕获i
的当前值。还有其他方法可以解决此问题,但是此解决方案非常简洁。