Python 在循环命令中创建按钮失败

Python 在循环命令中创建按钮失败,python,python-3.x,tkinter,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(

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

lambda
函数中使用默认值:

self.numButton.append(
    Button(root,text=num[i],command=lambda i=i: self.do(num[i])))
默认值在定义
lambda
函数时计算并绑定到函数(与运行时相反)。因此,稍后,当按下按钮并在没有任何参数的情况下调用回调时,将使用默认值

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


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

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

lambda
函数中使用默认值:

self.numButton.append(
    Button(root,text=num[i],command=lambda i=i: self.do(num[i])))
默认值在定义
lambda
函数时计算并绑定到函数(与运行时相反)。因此,稍后,当按下按钮并在没有任何参数的情况下调用回调时,将使用默认值

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


如果回调需要额外的参数,例如on
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])
非常感谢,我知道我遗漏了什么。作为问题的扩展,当我同时需要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])