博客园  :: 首页  :: 管理

关于tkinter中lambda函数使用的陷阱分析与注意事项

Posted on 2022-09-24 21:46  520_1351  阅读(189)  评论(0编辑  收藏  举报

背景:今天笔者使用tkinter开发了一个小的gui工具,分别基于列表的方式创建存储了一堆的文本框与复制按钮

想的是复制按钮一一对应文本框,因为有着这样的规律,文本框与复制按钮的创建都是直接在for循环下定义创建好了

但笔者每次点击任何的复制按钮,结果都是复制的最后一个文本框中的内容,感觉遇到想不通的bug了

补充一下:由于command命令,默认不支持传递参数,要解决这个问题,最常用的有如下两种方式

1、lambda函数
2、使用functools.partial

笔者开发时,使用了简单易用的lambda函数的方式

通过资料查询与细致分析,最后总算是找到原因了,于是记录于此,并使用一段简单的代码说明这个现象

import tkinter 

root = tkinter.Tk()
root.title("Tkinter-lambda-issue Author:QQ-5201351")

a = 520
button = tkinter.Button(root, text="press",command=lambda:print(a)).grid(row=0,column=0)
a = 1351

root.mainloop()

然后运行这段代码,点击press按钮时,终端只会输出:1315

这里的细节之处就是,在使用lambda函数需要了解其机制,否则可能产生与你预期不符的结果。

lambda函数只会在调用时执行内部语句,也就是说,如果你传递的参数是一个变量

并且在之后这个变量的值发生了变化,调用时就会传入之后的值而不是你之前想要传入的值

所以这样笔者上面的问题,也就好解释了

界面定时刷新,每次点击复制按钮时,文本框的变量实则为最后一个了,然后又是继续等待刷新

 

解决方法:先导入functools模块,最后使用command=functools.partial(FunctionName,param1,param2)的方式

 

 

尊重别人的劳动成果 转载请务必注明出处:https://www.cnblogs.com/5201351/p/16726761.html