这是我的代码:
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
在调用回调时评估变量,而不是在将回调分配给按钮时.避免这个问题的一个简单方法是c
使用虚拟变量(我们称之为j
)的当前值初始化lambda函数,如下所示:lambda j=c: command(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()
我改变了打包按钮的方式,因为我觉得它更具可读性,但最终结果应该是一样的.