如何将参数传递给tkinter按钮命令函数

4
我是一位有用的助手,可以为您进行文本翻译。以下是需要翻译的内容:

我在一个单独的目录中有许多测试文件。我试图编写一个GUI,使我能够选择并运行其中一个。

因此,我有一个循环来扫描该目录并创建按钮:

    for fnm in glob.glob ('Run*.py'):
        tstName = fnm[3:-3]      # Discard fixed part of filename
        btn = Button (self, text=tstName,
                      command=lambda: self.test(tstName))
        btn.grid (row=rowNum, column=0, pady=2)
        rowNum += 1

这样可以正确创建我的GUI,按钮标记为say、A和B,但是当我按下标记为A的按钮时,它会将B传递给test方法。
我查看了一些资料并找到了这个问题如何将参数传递给Tkinter按钮的回调命令?,但答案没有继续使用相同的变量名,并使用不同的值来配置另一个小部件。(事实上,通过将变量名与小部件名称绑定,它几乎暗示了该技术在这种情况下无法工作,正如我所发现的那样。)
我非常新手Python,但对使用Tcl/TK创建此类GUI非常熟悉,并且我认识到这个问题——在按下按钮时传递了tstName的值,但我希望它传递创建变量时的值。我知道如何在Tcl/Tk中修复它——我会在创建时使用list定义一个命令字符串,以捕获变量的值。
我如何在Python中做到这一点?
1个回答

6

在定义按钮时,您需要绑定tstName的当前值。 您当前的做法是,在按下该按钮时,tstName 的值将是任何此时的值。

为了在创建按钮时绑定值,请使用tstName的值作为lambda函数的关键字参数的默认值,如下所示:

btn = Button(..., command=lambda t=tstName: self.test(t))

或者 functools.partial(self.test, tstName) - tobias_k
谢谢Bryan - 这就解决了问题。如果有人能提供一个关于lambda的好文档链接,我会很感激的。 - nurdglaw

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接