You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将所有Tkinter Entry传入按钮command回调,解决仅传最后一个Entry的问题

Tkinter循环生成Entry绑定回调传参解决方案

问题根因

循环中每次给x_entry变量赋值会覆盖上一次的对象引用,而lambda回调是延迟执行的,点击按钮触发回调时,x_entry已经指向最后一次循环生成的Entry控件,因此只能获取到最后一个输入框的值。

最优直接方案

不需要额外引入StringVar和trace监听,只需要用容器存储所有生成的Entry控件引用,回调时直接传入整个容器即可:

  1. 循环外定义空列表/字典,存储所有Entry实例
  2. 每次生成Entry后将其加入容器
  3. 按钮回调直接传入整个容器,在回调函数中遍历调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 00:36:03