我在一个目录中有许多测试文件。我正在尝试编写一个 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 中执行相同的操作?
您需要在定义 按钮时绑定(bind) tstName 的当前值。按照您的操作方式,tstName
的值将与您按下按钮时的值保持一致。
要在创建按钮时绑定(bind)值,请将 tstName 的值用作 lambda 关键字参数的默认值,如下所示:
btn = Button(..., command=lambda t=tstName: self.test(t))
我是一名优秀的程序员,十分优秀!