【问题标题】:Creating buttons inside loop command failing在循环命令中创建按钮失败
【发布时间】:2013-09-22 01:08:21
【问题描述】:

在 python 中使用 Tkinter,尝试制作编号按钮,使用 self.do(x) 将数字 x 添加到字符串变量。这段特殊的代码在循环中(为了节省空间)的问题在于,它会将 LAST 数字添加到字符串中(即本例中的 9)。这是因为它在此之后调用函数,并使用 num[i] 的最新值。有什么办法可以改正吗?

self.numButton = []
num = []
for i in range(9):
    num.append(i + 1)
    self.numButton.append(Button(root,text=num[i],command=lambda: self.do(num[i])))

【问题讨论】:

  • 那一行字很难读。你能把它分成多行或创建一个函数来删除问题中无关紧要的部分吗?
  • 你去吧,长度很重要,但我把一般不需要的部分去掉了。

标签: python python-3.x tkinter


【解决方案1】:

lambda 函数中使用默认值:

self.numButton.append(
    Button(root,text=num[i],command=lambda i=i: self.do(num[i])))

默认值在lambda 函数被定义 时被评估并绑定到函数(而不是在它运行时)。因此,稍后,当按下按钮并调用回调没有任何参数时,将使用默认值。

由于i 的不同默认值绑定到每个lambda 函数,因此i 的适当值用于每个回调。


如果回调需要额外的参数,例如event,只需将带有默认值的参数放在末尾即可。例如,

root.bind('Key-{n}'.format(n=num[i]), lambda e, i=i: self.do(num[i]))

【讨论】:

  • 非常感谢,我知道我错过了一些东西。作为问题的扩展,当我同时需要 lambda e: 和 lambda i=i: 时,如何将 self.do(x) 绑定到一个键? 'root.bind(str(num[i]),lambda e: self.do(num[i]))'
  • root.bind('Key-{n}'.format(n=num[i]), lambda e, i=i: self.do(num[i]))
猜你喜欢
  • 2019-09-07
  • 1970-01-01
  • 2020-05-28
  • 2022-11-04
  • 2021-09-19
  • 1970-01-01
  • 2019-12-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多