基于Excel数据,用Python Tkinter实现Combobox联动填充与数据保存
实现方案与修正代码
核心思路
先把原Excel的所有行数据加载为字典(用A列值做键,对应其他列数据做值),选中Combobox选项时能快速匹配到对应数据;然后在Tkinter中添加展示控件,绑定Combobox的选中事件,触发时更新UI并将完整数据写入新Excel。
完整修正代码
import tkinter as tk from tkinter import ttk from openpyxl import load_workbook, Workbook # 加载源数据Excel,建立物料描述与其他列的映射 wb = load_workbook(filename=r"C:\Users\Chinnu\Downloads\exampleapp\testdata.xlsx") ws = wb['Sheet1'] # 存储所有数据:key=物料描述(A列), value=(B列值, C列值) material_data = {} # 从第2行开始遍历所有有效行(假设第1行是表头) for row in ws.iter_rows(min_row=2, values_only=True): if row[0] is not None: # 跳过空行 material_data[row[0]] = (row[1], row[2]) # 初始化或加载存储用的Excel文件 try: wBook = load_workbook('storingfile.xlsx') sheet = wBook.active except FileNotFoundError: # 如果文件不存在,创建新工作簿并添加表头 wBook = Workbook() sheet = wBook.active sheet.append(["Material Description", "Column B", "Column C"]) # Tkinter应用初始化 win = tk.Tk() win.title("物料数据选择") # 定义存储选中值的变量 selected_material = tk.StringVar() # --- UI控件布局 --- # 物料描述选择框 ttk.Label(win, text="Material Description:").grid(row=0, column=0, padx=10, pady=10) combodata = ttk.Combobox(win, textvariable=selected_material, values=list(material_data.keys())) combodata.grid(row=0, column=1, padx=10, pady=10) # 其他列数据展示控件 ttk.Label(win, text="Column B Data:").grid(row=1, column=0, padx=10, pady=10) col_b_entry = ttk.Entry(win, state="readonly") col_b_entry.grid(row=1, column=1, padx=10, pady=10) ttk.Label(win, text="Column C Data:").grid(row=2, column=0, padx=10, pady=10) col_c_entry = ttk.Entry(win, state="readonly") col_c_entry.grid(row=2, column=1, padx=10, pady=10) # --- 事件处理函数 --- def on_material_selected(event): # 获取选中的物料描述 mat_desc = selected_material.get() if mat_desc in material_data: # 获取对应的B、C列数据 col_b, col_c = material_data[mat_desc] # 更新UI展示:先设置为可编辑,写入数据后再设为只读 col_b_entry.config(state="normal") col_b_entry.delete(0, tk.END) col_b_entry.insert(0, col_b if col_b else "") col_b_entry.config(state="readonly") col_c_entry.config(state="normal") col_c_entry.delete(0, tk.END) col_c_entry.insert(0, col_c if col_c else "") col_c_entry.config(state="readonly") # 将完整数据写入新Excel sheet.append([mat_desc, col_b, col_c]) wBook.save('storingfile.xlsx') # 绑定Combobox选中事件(包括下拉选择和键盘输入选择) combodata.bind("<<ComboboxSelected>>", on_material_selected) combodata.bind("<KeyRelease>", on_material_selected) win.mainloop()
关键部分说明
- 数据映射:用
iter_rows(values_only=True)遍历原Excel行,把每行数据存进字典,后续可以O(1)时间查找对应数据,比逐行遍历效率更高。 - 存储文件处理:增加了文件不存在时的创建逻辑,自动添加表头,避免空文件报错。
- UI交互:用
readonly状态的Entry展示数据,确保用户不能修改,只能查看;选中事件触发时同步更新UI并写入完整的一行数据到存储Excel。 - 事件绑定:同时绑定
<<ComboboxSelected>>(下拉选择)和<KeyRelease>(键盘输入选择),覆盖所有选择场景。
内容的提问来源于stack exchange,提问作者svh
相关产品推荐
相关产品推荐

