我在一个目录中有许多测试文件。我正在尝试编写一个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,按钮标记为“说”,“A”和“B”,但当我按下标有“A”的按钮时,它会将B
传递给test
方法。
我环顾四周并发现了这个问题How can I pass arguments to Tkinter button's callback command?,但答案并没有继续使用相同的变量名,而是使用不同的值来配置另一个小部件。 (事实上,通过将变量名称绑定到小部件名称,它几乎意味着该技术在这种情况下不起作用,正如我所发现的那样。)
我是非常 Python的新手,但我非常熟悉使用Tcl / TK创建这种GUI并且我认识到这个问题 - tstName
的值正在传递我按下按钮,但我希望它传递变量在创建时的值。我知道如何在Tcl / Tk中修复它 - 我在创建时使用[list]
定义一个命令字符串,它将捕获变量的值。
我如何在Python中做同样的事情?
答案 0 :(得分:4)
您需要在定义按钮时绑定tstName的当前值。你这样做的方式,tstName
的价值将与你按下按钮时的价值无关。
要在创建按钮时绑定值,请使用tstName的值作为lambda的关键字参数的默认值,如下所示:
btn = Button(..., command=lambda t=tstName: self.test(t))