Python Tkinter中使用get()获取Entry输入值的简便实现方法
最简优化方案
完全不需要额外维护全局的结果列表entriesList2,直接用Python列表推导式就能在按钮触发时,一行完成所有Entry控件的输入值批量读取:
def appendToDict(): # 点击按钮时临时生成输入值列表,函数执行完成后自动回收内存,无长期存储开销 all_inputs = [entry.get() for entry in entriesList] print(all_inputs)
只需要删掉原本的entriesList2 = []全局定义,替换掉原来的循环append逻辑即可,没有任何冗余步骤。
为什么你之前的写法不生效
你尝试在循环里写i = i.get()没效果,和Tkinter本身无关,是Python的for循环运行机制决定的:
- for循环遍历列表时,临时变量
i只是当前拿到的Entry对象的临时引用 - 在循环体内给
i重新赋值,只会覆盖这个临时变量本身的值,既不会修改原列表里存的控件实例,也不会把get()的结果同步回原列表,自然达不到你想要的“批量替换成输入值”的效果。
原有代码的隐藏问题
你之前用全局entriesList2存结果的写法,其实存在逻辑bug:
- 这个全局列表不会在每次触发按钮时清空,每点一次按钮就会把当前的输入值全部追加到列表尾部
- 多次点击后,列表会不断累积历史输入值,长度翻倍增长,根本不是你想要的“读取当前所有输入”的效果,还会无意义占内存。
进阶优化(适配你的业务结构)
从代码逻辑看,你的界面是“列对应车品牌、行对应车辆属性”的表格,后续本来就要把输入值整理成字典结构的话,可以把Entry控件按属性维度做结构化存储,省掉后续手动对应位置的步骤:
- 把原本的一维
entriesList替换成字典,以属性名(Country/Modell/...)为key,对应行的所有Entry列表为value - 取值时直接按属性维度批量读取,直接生成结构化的结果,不需要二次整理位置
# 替换原有全局列表定义 entries_map = {} for attr_idx, attr_name in enumerate(Attributes): row_entries = [] for car_idx, car_name in enumerate(Car): myEntry = Entry(root) myEntry.grid(row=attr_idx+1, column=car_idx+1) row_entries.append(myEntry) entries_map[attr_name] = row_entries # 替换原有回调函数 def appendToDict(): result = { attr_name: [entry.get() for entry in row_entries] for attr_name, row_entries in entries_map.items() } print(result)
内容的提问来源于stack exchange,提问作者Nirevezs
相关产品推荐
相关产品推荐

