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

基于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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 09:15:09