这是我的代码:
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()
Run Code Online (Sandbox Code Playgroud)
运行脚本时,按钮全部打印4,而我希望它们打印显示在它们上面的数字.你怎么能这样做?
我使用的是Python 3.4
乍一看,这里有一些错误.首先,你的for循环需要缩进四个空格,如下所示:
for c in range(0, 5):
b.append(Button(a, text=c, command=lambda: command(c))
b[c].pack()
Run Code Online (Sandbox Code Playgroud)
如果你不这样做,那么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()
Run Code Online (Sandbox Code Playgroud)
我改变了打包按钮的方式,因为我觉得它更具可读性,但最终结果应该是一样的.