Tkinter中用for循环创建带参按钮时全部输出else的问题排查
问题原因与解决方法
你遇到的问题是闭包的延迟绑定导致的:循环中创建的lambda函数并没有在定义时就捕获当前的x值,而是等到按钮被点击时才去读取x的当前值。当循环结束后,x已经指向列表的最后一个元素'else',所以所有按钮点击后都会调用ins('else')。
解决方法有两种:
方法1:给lambda添加默认参数
通过给lambda设置默认参数,让它在定义时就绑定当前循环的x值:
statements = ['print', 'if', 'else'] def ins(state): print(state) count = 0 for x in statements: # 给lambda添加默认参数x=x,绑定当前循环的x值 b = Button(self.funcFrame, text=x, command=lambda x=x: ins(x)) b.grid(row=0, column=count) count += 1
方法2:使用functools.partial
functools.partial可以帮你提前绑定函数参数,避免闭包延迟绑定的问题:
from functools import partial statements = ['print', 'if', 'else'] def ins(state): print(state) count = 0 for x in statements: # 用partial绑定ins函数的state参数为当前x b = Button(self.funcFrame, text=x, command=partial(ins, x)) b.grid(row=0, column=count) count += 1
内容的提问来源于stack exchange,提问作者Chiz
相关产品推荐
相关产品推荐

