首页 > 其他分享 >关于tkinter中lambda函数使用的注意事项与陷阱分析

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

时间:2022-09-24 21:55:41浏览次数:459  
标签:tkinter 注意事项 文本框 复制 按钮 root lambda

背景:今天笔者使用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

 

标签:tkinter,注意事项,文本框,复制,按钮,root,lambda
From: https://www.cnblogs.com/5201351/p/16726761.html

相关文章

  • Basler相机SDK注意事项
    1、格式转换后,CPylonImage.GetBuffer()访问冲突原因是ptrGrabResult里有缓存,需在合适的位置先 ptrGrabResult.Release()。推荐使用方式二。2、QPixmap::fromImage(img)......
  • JS注意事项 && 代码调试
    JavaScript识别七种基本(不可变)数据类型:Boolean、Null、Undefined、Number、String、Symbol(ES6新增)和BigInt(ES2020新增),以及一种可变项类型:Object。注意,在JavaScript中,数组严......
  • lambdaQuery中EQ、NE、GT、LT、GE、LE的用法
    lt:lessthan小于le:lessthanorequalto小于等于eq:equalto等于ne:notequalto不等于ge:greaterthanorequalto大于等于gt:greaterthan大于lq:是小于等于Maybat......
  • 【中科三方】IPv4向IPv6转换的几种技术分析,ipv6转换注意事项
    一、IPv6介绍随着互联网技术的不断发展,IPv4的许多缺陷逐渐暴露出来,其中最突出的是IP地址空间将被耗尽和主干路由表不断增长的问题。为了扩大地址空间,拟通过IPv6重新定义地......
  • Java学习笔记---JDK8新特性(Lambda表达式)
    1.Lambda表达式基础格式:()->{};//()为lambda表达式的参数//->为箭头操作符//{}为lambda方法体lambda表达式结果为一个实例对象,用于直接实例化......
  • python lambda的使用说明
    一用途减少代码冗余没有函数名字,也指匿名函数快速实现函数功能二用法说明:lambdaargument_list:expersionargument_list表示输入传入的参数expersion表......
  • python笔记——filter/lambda/all
    python笔记——filter/lambda/allall函数all()函数用于判断给定的可迭代参数iterable中的所有元素是否都为TRUE,如果是返回True,否则返回False。语法:all(iterable)......
  • .net 发起http请求例子和注意事项
     #region----发起apiUrl请求----///<summary>///发起apiUrl请求///</summary>///<paramname="url"></param>///<p......
  • C++中的Lambda表达式
    C++中的Lambda表达式代码如下:[capture](parameters)mutable->return-type{statement}[capture]:捕捉列表。捕捉列表总是出现在Lambda函数的开始处。实际上,[]是Lambd......
  • python lambda创建匿名函数
    注意:lambda只是一个表达式,函数体比def简单很多。lambda的主体是一个表达式,而不是一个代码块。仅仅能在lambda表达式中封装有限的逻辑进去。lambda函数拥有自己的命名空......