如何将所有Tkinter Entry传入按钮command回调,解决仅传最后一个Entry的问题
Tkinter循环生成Entry绑定回调传参解决方案
问题根因
循环中每次给x_entry变量赋值会覆盖上一次的对象引用,而lambda回调是延迟执行的,点击按钮触发回调时,x_entry已经指向最后一次循环生成的Entry控件,因此只能获取到最后一个输入框的值。
最优直接方案
不需要额外引入StringVar和trace监听,只需要用容器存储所有生成的Entry控件引用,回调时直接传入整个容器即可:
- 循环外定义空列表/字典,存储所有Entry实例
- 每次生成Entry后将其加入容器
- 按钮回调直接传入整个容器,在回调函数中遍历调用
get()方法即可拿到所有用户修改后的实时输入值
示例代码
用列表存储(按生成顺序取值)
# 循环外初始化Entry存储列表 entry_list = [] for x, z in enumerate(data): x_label = tk.Label(mod_window, text=z, width=10, anchor='e') x_label.place(x=5, y=ycoord_count) x_entry = tk.Entry(mod_window, width=25) x_entry.place(x=100, y=ycoord_count) x_entry.insert(0, f'{dati_user[0][x+1]}') # 将当前Entry加入列表 entry_list.append(x_entry) ycoord_count += 40 # 回调直接传入整个列表 modifica_button = tk.Button(mod_window, text='Modifica', width=7, relief='groove', command=lambda :self.test(entry_list))
对应的回调函数写法:
def test(self, entry_list): # 遍历获取所有输入值,顺序和Entry生成顺序完全一致 all_input = [entry.get() for entry in entry_list] # 后续业务逻辑直接使用all_input即可
用字典存储(按字段名取值)
如果需要根据字段名直接获取对应输入值,可以把列表换成字典:
# 循环外初始化Entry存储字典,key为字段名,value为Entry实例 entry_dict = {} for x, z in enumerate(data): # 其他控件生成逻辑不变 entry_dict[z] = x_entry ycoord_count += 40 modifica_button = tk.Button(mod_window, text='Modifica', width=7, relief='groove', command=lambda :self.test(entry_dict))
回调函数中可以直接按字段名取值:
def test(self, entry_dict): # 直接按字段名获取对应输入值 username = entry_dict["username"].get() age = entry_dict["age"].get()
方案优势
- 实现逻辑简单,没有额外的监听开销
- 调用
get()方法时直接读取控件当前值,天然是用户修改后的最新值,不需要额外做数据同步 - 可以灵活选择列表/字典作为存储容器,适配不同的取值需求
内容的提问来源于stack exchange,提问作者Nico
相关产品推荐
相关产品推荐

