【问题标题】:How to make python loop remember each value? [duplicate]如何让python循环记住每个值? [复制]
【发布时间】: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 我按下的任何按钮。我不知道这是lambdatkinter 的问题,还是只是我的编程问题,但我想知道如何解决它。

我尝试过使用copy.copycopy.deepcopy(在lambda 函数和字符串上)以及[:]str(在字符串上)。

【问题讨论】:

  • @Aran-Fey 虽然链接问题的答案将为我提供解决方案,但它没有回答我的问题,因为它定义了函数,并且不使用lambda。当我尝试lambda:add(text=i) 时,我遇到了同样的问题。
  • 我不明白有什么区别。 lambda 只是定义函数的另一种方式。 (如果你仔细阅读答案,你会发现你需要lambda i=i:add(i)而不是lambda:add(text=i)。)
  • @Aran-Fey lambda ii 作为参数,我的函数不应该,它应该在函数中使用i
  • 如果可选参数确实有问题,您可以使用相同答案中提出的make_f 解决方案。
  • @Aran-Fey 我现在已经意识到你之前的意思了。感谢您的耐心和帮助。我不知道如何撤回我的重新投票,但我会的。

标签: python python-3.x for-loop tkinter lambda


【解决方案1】:

有一个常见的技巧:

for i in ...:
    def command(i=i):
        add(i)
    Button(..., command=command)

它看起来有点难看,但它在默认参数值中捕获了i 的当前值。还有其他方法可以解决这个问题,但这个解决方案相当简洁。

【讨论】:

  • 只是想知道,您是如何回答重复标记的问题的?这是特权吗?
  • 我想知道是否存在竞争条件。在我回答之前,我没有看到重复出现。
  • 如果有很短的宽限期,我不会感到惊讶。
猜你喜欢
  • 2018-04-25
  • 2011-03-08
  • 2016-01-20
  • 2022-12-03
  • 2018-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-09
相关资源
最近更新 更多