python - lambda 命令根据按下的按钮给出一个参数
问题描述
我有一个在目录中搜索.json
文件的功能。然后,我为找到的每个.json
文件创建了一个按钮(没有固定的文件数量)。如果用户按下包含他们想要使用的文件的按钮,我想要做什么。
我必须尝试实现的代码如下:
numLink = 0
for i in list_of_json_files:
basename = os.path.basename(str(i))
filename = os.path.splitext(basename)[0].replace("_", " ")
Button(loadCreate, text=filename.title(), command=lambda: open_use_existing_rink_book(numLink), pady=5, padx=5).grid(row=n, column=1, pady=5)
n += 1
numLink += 1
print(numLink)
我认为这样做是给每个按钮一个不同的函数参数编号open_use_existing_rink_book()
,因此我可以区分按下的按钮。例如,如果有 3 个.json
文件(json1、json2、json3),如果我单击以 json2 作为文本的按钮,我想知道该按钮已被按下。
我能想到的唯一其他方法是将按钮的文本作为参数传递给open_use_existing_rink_book()
,但我不确定我会如何做到这一点,也许是使用文本变量?
解决方案
你快到了。你这样做的方式总是会传递numLink
. 您必须将您的更改lambda
为以下内容才能正常工作。
lambda nl=numLink: open_use_existing_rink_book(nl)
原因很简单。在您的版本中,您只是将引用传递numLink
给您的函数,因此所有调用都将针对 numLink 的最终值。在我向您展示的版本中,当前值numLink
被存储在nl
其中,并且该值正在传递给您的函数。
推荐阅读
- mysql - MYSQL - 错误 1048 (23000): 列不能为空
- unity3d - Facebook SDK for unity - 如何以编程方式设置 App Id?
- python - 在 Python 中仅使用一次数字进行整数分区的递归很慢
- linux - 删除 BeagleBone ai 上先前生成的 .dtb 文件
- python - 保留一个索引,以记录 if 语句在列表理解中传递了多少次
- mysql - 为基于 DOCKER 的应用程序创建 SSH 隧道以连接到数据库?
- excel - 如何在excel中转换自定义日期格式?
- excel - 选择后设置打印区域以适应
- java - 在 Java 中,新建或增强类加载器的用例是什么?
- javascript - 我如何查看用户是否已经投票、使用反应以及是否已经投票;停止计票?不和谐.js