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行

posted on 2023-02-02 15:49  张博的博客  阅读(30)  评论(0编辑  收藏  举报

导航