在循环命令内创建按钮失败

时间:2013-09-22 01:08:21

标签: python python-3.x tkinter

在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])))

1 个答案:

答案 0 :(得分: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]))