这是我的代码:
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
答案 0 :(得分:5)
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()
我改变了你打包按钮的方式,因为我觉得它更具可读性,但最终结果应该是一样的。