如何简化Tkinter中更新两列Entry组件值的for循环代码
优化实现方案
原代码存在三个潜在问题:
- 依赖
winfo_children()返回的组件创建顺序,若组件顺序不是【行N列0 → 行N列1】,会出现赋值错位 - 没有清空列1输入框原有内容,直接调用
insert会导致新旧内容叠加 - 未筛选组件类型,如果frame中存在非Entry组件,调用
get()方法会直接报错
方案1:按行号映射赋值(逻辑最稳定,兼容任意组件顺序)
通过字典推导式先构建行号到列0输入值的映射,再批量给列1对应行的Entry赋值:
def update_company_new(): # 构建行号: 列0输入值的映射 row_val = {w.grid_info()["row"]: w.get() for w in frame.winfo_children() if w.winfo_class() == "Entry" and w.grid_info()["column"] == 0} # 给列1对应行的Entry赋值 for w in frame.winfo_children(): if w.winfo_class() == "Entry" and w.grid_info()["column"] == 1: w.delete(0, "end") w.insert(0, row_val.get(w.grid_info()["row"], ""))
方案2:行列配对赋值(适合每行固定有列0+列1Entry的场景)
按行列排序后直接配对列0和列1的Entry,写法更简洁:
def update_company_new(): entries = sorted(frame.winfo_children(), key=lambda x: (x.grid_info()["row"], x.grid_info()["column"])) col0 = [w for w in entries if w.grid_info()["column"] == 0 and w.winfo_class() == "Entry"] col1 = [w for w in entries if w.grid_info()["column"] == 1 and w.winfo_class() == "Entry"] for c0, c1 in zip(col0, col1): c1.delete(0, "end") c1.insert(0, c0.get())
相关参数说明
winfo_children():返回父容器下所有子组件的迭代器,顺序为组件的创建顺序,和grid布局的行列位置无关,不要依赖该顺序做行匹配grid_info():返回组件的grid布局属性字典,直接取row和column键即可获得组件对应的行号和列号,没有额外适配参数winfo_class():返回组件的类型字符串,Entry组件的返回值固定为Entry,加该筛选可避免非输入框组件调用get()报错
内容的提问来源于stack exchange,提问作者WRL41225
相关产品推荐
相关产品推荐

