背景:今天笔者使用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
作者:一名卑微的IT民工
出处:https://www.cnblogs.com/5201351
本博客所有文章仅用于学习、研究和交流目的,欢迎非商业性质转载。
由于博主的水平不高,文章没有高度、深度和广度,只是凑字数,不足和错误之处在所难免,希望大家能够批评指出。
博主是利用读书、参考、引用、复制和粘贴等多种方式打造成自己的文章,请原谅博主成为一个卑微的IT民工!