我有一个动态生成 GUI 的程序。我不知道我会有多少个按钮,如果有的话。
具体问题是这样的:
for varname in self.filetextboxes:
if self.varDict[varname]=='':
self.varDict[varname] = (StringVar(),)
self.varDict[varname][0].set('')
fileButton = Button(self, text=" ", command = lambda:self.varDict[varname][0].set(tkFileDialog.askopenfilename()), image=self.filephoto)
ftb = Entry(self, textvariable = self.varDict[varname][0],width=40,background='white')
我有一个创建文本框和按钮的 for 循环。StringVar() 存储在带有 key 的字典中varname
。
因为我无法在按钮的回调函数中传递参数,所以我改为在每个按钮中定义一个 lambda。这会将与此循环中创建的文本框关联的 StringVar() 设置为文件对话框的输出。
问题是,传递给 lambda 的 varname 没有传递值,而只是传递了变量的名称。因此,虽然文本框与在 for 循环中创建它们的变量相关联,但按钮中的 lambdas 始终使用 varname 的当前值。
换句话说,每个文本框只链接一个变量,但所有的按钮只设置最终创建的文本框的文本,即最终值为varname的文本框。
还有另一种方法可以解决这个问题吗?我可以让 lambda 以某种方式只使用定义的 varname 的值,而不使用 varname 的未来值吗?