首页 > 解决方案 > 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(),但我不确定我会如何做到这一点,也许是使用文本变量?

标签: pythontkinterlambda

解决方案


你快到了。你这样做的方式总是会传递numLink. 您必须将您的更改lambda为以下内容才能正常工作。

lambda nl=numLink: open_use_existing_rink_book(nl)

原因很简单。在您的版本中,您只是将引用传递numLink给您的函数,因此所有调用都将针对 numLink 的最终值。在我向您展示的版本中,当前值numLink被存储在nl其中,并且该值正在传递给您的函数。


推荐阅读