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