1

在 python 中使用 Tkinter,尝试制作编号按钮,这些按钮使用 self.do(x) 将数字 x 添加到字符串变量。这段特定的代码在循环中(为了节省空间)的问题在于,它会将最后一个数字添加到字符串中(即本例中的 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])))
4

1 回答 1

1

在函数中使用默认值lambda

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

默认值在定义lambda函数时计算并绑定到函数(与运行时相反)。因此,稍后,当按下按钮并在没有任何参数的情况下调用回调时,将使用默认值。

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


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

root.bind('Key-{n}'.format(n=num[i]), lambda e, i=i: self.do(num[i]))
于 2013-09-22T01:44:02.027 回答