【发布时间】:2018-12-22 20:36:55
【问题描述】:
每当我通过循环在 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(在字符串上)。
【问题讨论】:
-
@Aran-Fey 虽然链接问题的答案将为我提供解决方案,但它没有回答我的问题,因为它定义了函数,并且不使用
lambda。当我尝试lambda:add(text=i)时,我遇到了同样的问题。 -
我不明白有什么区别。
lambda只是定义函数的另一种方式。 (如果你仔细阅读答案,你会发现你需要lambda i=i:add(i)而不是lambda:add(text=i)。) -
@Aran-Fey
lambda i将i作为参数,我的函数不应该,它应该在函数中使用i。 -
如果可选参数确实有问题,您可以使用相同答案中提出的
make_f解决方案。 -
@Aran-Fey 我现在已经意识到你之前的意思了。感谢您的耐心和帮助。我不知道如何撤回我的重新投票,但我会的。
标签: python python-3.x for-loop tkinter lambda