gpt4 book ai didi

python - 如何让 for 循环生成的 TO 按钮将输入传递给其命令? (Python)

转载 作者:行者123 更新时间:2023-12-01 05:59:56 26 4
gpt4 key购买 nike

我有一个可以动态生成 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() 存储在字典中,键为 varname .

因为我无法在按钮的回调函数中传递参数,所以我在每个按钮中定义了一个 lambda。这会将与此循环中创建的文本框关联的 StringVar() 设置为文件对话框的输出。

问题是,传递给 lambda 的 varname 并未传递值,而仅传递变量的名称。因此,虽然文本框与在 for 循环中创建的变量相关联,但按钮中的 lambda 始终使用 varname 的当前值。

换句话说,每个文本框仅链接到一个变量,但所有按钮仅设置最终创建的文本框的文本,即最终值为 varname 的文本框。

还有其他方法可以解决这个问题吗?我可以让 lambda 只使用定义的 varname 值,而不使用 varname 的 future 值吗?

最佳答案

我必须承认——这让我有点难住了。由于您要将 Button 与 Entry 和 stringvar 配对,因此一种解决方法是将它们包装在一个类中。 (无论如何,我可能会说这更优雅一点......)

import Tkinter as tk

class ButtonEntry(tk.Frame):
def __init__(self,master,ss):
tk.Frame.__init__(self)
self.var=tk.StringVar()
self.var.set(ss)
self.Button=tk.Button(self,text='Button',command=lambda :self.var.set("foo!"))
self.Entry=tk.Entry(self,textvariable=self.var)
self.Button.grid(row=0,column=0)
self.Entry.grid(row=0,column=1)


class App(tk.Frame):
def __init__(self,master=None):
tk.Frame.__init__(self,master)
self.BEs=[]
for i in range(10):
b=ButtonEntry(self,'Button %d'%i)
b.grid(row=i,column=0)
self.BEs.append(b)


if __name__ == '__main__':
root=tk.Tk()
f=App(root)
f.grid(row=0,column=0)
root.mainloop()

但是,我真的很想知道为什么 lambda 会有这样的行为。我确信你所拥有的应该有效。

编辑

我已经追踪到了 lambda 函数的行为。 https://stackoverflow.com/a/10452819/748858给出了如何正确执行此操作的一个很好的示例。问题是 lambda 函数中的变量仍然绑定(bind)到声明 lambda 的范围。为了解除它们与该范围的关联,您需要将它们设置为函数的关键字参数。好的!今天早上我学到了一些新东西。

关于python - 如何让 for 循环生成的 TO 按钮将输入传递给其命令? (Python),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10987333/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com