这是我的代码:
from tkinter import *
def command(d):
print(d)
a = Tk()
b = []
for c in range(0, 5):
b.append(Button(a, text=c, command=lambda: command(c)))
b[c].pack()
a.mainloop()
运行脚本时,按钮都打印 4,而我希望它们打印上面显示的数字。你怎么能这样做?
我正在使用 Python 3.4
请您参考如下方法:
乍一看,这里有几处错误。首先,您的 for 循环需要像这样缩进四个空格:
for c in range(0, 5):
b.append(Button(a, text=c, command=lambda: command(c))
b[c].pack()
如果您不这样做,那么对于脚本的其余部分,c 的值将为 4,因为这是最后一次迭代的 c 的值的 range(0, 5)。
您的按钮总是打印 4 的原因是因为变量 c 是在调用回调时计算的,而不是在您将回调分配给按钮时计算的。避免此问题的一种简单方法是使用伪变量(我们将其称为 j)使用 c 的当前值初始化 lambda 函数,如下所示:lambda j=c: 命令(j)。把它们放在一起,你应该有这样的东西:
from tkinter import *
def command(d):
print(d)
a = Tk()
b = []
for c in range(0, 5):
x = Button(a, text=c, command=lambda j=c: command(j))
x.pack()
b.append(x)
a.mainloop()
我改变了你打包按钮的方式,因为我认为它更具可读性,但最终结果应该是一样的。
