2013-10-23 39 views
3

我在单个目录中有许多测试文件。我正在尝试编写一个GUI来允许我选择并运行其中的一个。有关将参数传递给tkinter按钮命令的更多信息

所以,我有一个循环,扫描目录,并创建按钮:

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它传递Btest方法。

我环顾四周,发现这个问题How can I pass arguments to Tkinter button's callback command?,但答案并没有继续使用相同的变量名,用不同的值来配置另一个小部件。 (事实上​​,通过捆绑变量名部件名几乎意味着该技术不会在这种情况下工作,因为我发现。)

到Python非常新的,但我对使用Tcl/TK创建这种图形用户界面非常熟悉,我认识到这个问题 - 当我按下按钮时,会传递tstName的值,但我希望它能够传递变量在创建时的值。我知道如何在Tcl/Tk中解决这个问题 - 我会在创建时使用[list]来定义一个命令字符串,它将捕获变量的值。

如何在Python中执行相同的操作?

回答

4

您需要绑定tstName的当前值,当时您的定义了这个按钮。你这样做的方式,tstName的值将是你按下按钮时的值。

要绑定的时候,你创建按钮的值,使用tstName的值作为关键字参数对拉姆达的默认值,就像这样:

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

或'functools.partial(个体经营.test,tstName)' –

+0

谢谢布赖恩 - 这是诀窍。如果有人会提供一个链接到'lambda'的文档,我会很感激。 – nurdglaw

相关问题