tkinter bind command add_command函数中避免变量全局化的坑如何避免!!!!!!!!!!!!!神级解决 方案!
for i in range(10):
b=tkinter.Button(frame, bg=colorlist[i],font=fffff,text =labellist[i], command =lamda x: func(x))
b.pack()
这种写法你会发现你创建了10个按钮,他们的函数全是fun(10)
这里面的机制是因为lamda函数创建的是闭包函数, 他传入的变量 i 是一个全局变量. 会共享. 所以for循环到最后只有一个i
那么我们如何避免呢. 其实很容易. 只需要函数再套一层即可.
def fun(i):
menubar = tkinter.Menu(frame)
def helper1(x=i):
x = i
return helloCallBack_quanbiaozhu(colorlist[x])
xxx = '全标'
menubar.add_command(label=xxx, command=helper1)
for i in range(10):
func(i)
这样.我们外层函数传进去的1到10, 到内层函数实际使用的时候他发生值拷贝不会再共享!!!!!!!!!!!!!!!
从而达到我们需要的效果!!!!!!!!!!!!!!
代码示例:
https://github.com/zhangbo2008/bio_tool_vesion4 1触发菜单版本.py :270行