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

如何用Python的csv库结合Tkinter实现按CSV首列筛选展示第二列内容

问题原因分析
  • 列名不匹配:CSV表头为Column1、Column2,代码中使用小写的row['column1']读取,无法获取对应列的值
  • 无效的空值判断:adata1 != adata1是用于判断浮点型NaN的逻辑,CSV读取的空单元格为字符串类型,该判断永远返回False,逻辑完全失效
  • 分隔符配置错误:你提供的CSV示例为制表符/多空格分隔,代码中配置的delimiter=','为逗号分隔,会导致行数据拆分错误
  • 缺少结构化存储和联动逻辑:没有先将CSV的层级关系整理为「测试编号-对应内容列表」的映射,也没有绑定列表选中事件,无法实现选择后刷新内容的效果
修复后完整实现代码
import tkinter as tk
import csv

# 第一步:读取CSV并整理为 {测试名: [对应内容列表]} 的映射结构
test_map = {}
current_test = None
# 注意:如果你的CSV实际是逗号分隔,将delimiter改为','即可
with open('Test.csv', 'r', encoding='utf-8') as f:
    reader = csv.DictReader(f, delimiter='\t')
    for row in reader:
        col1 = row['Column1'].strip()
        col2 = row['Column2'].strip()
        # 遇到非空的Column1就记录为当前所属测试
        if col1:
            current_test = col1
            test_map[current_test] = []
        # 将Column2内容加入对应测试的列表
        if col2 and current_test:
            test_map[current_test].append(col2)

# 第二步:构建GUI与联动逻辑
root = tk.Tk()
root.geometry('500x400')

# 左侧列表:展示所有测试编号
test_listbox = tk.Listbox(root, width=20, height=20)
test_listbox.place(x=10, y=50)
for test_name in test_map.keys():
    test_listbox.insert(tk.END, test_name)

# 右侧列表:展示选中测试对应的内容
content_listbox = tk.Listbox(root, width=40, height=20)
content_listbox.place(x=200, y=50)

# 绑定选中事件:选左侧测试名时刷新右侧内容
def on_test_select(event):
    content_listbox.delete(0, tk.END)
    selected = test_listbox.curselection()
    if not selected:
        return
    test_name = test_listbox.get(selected[0])
    for content in test_map[test_name]:
        content_listbox.insert(tk.END, content)

test_listbox.bind('<<ListboxSelect>>', on_test_select)

root.mainloop()
注意事项
  • 请根据你实际CSV的分隔符调整csv.DictReader的delimiter参数:逗号分隔填',',制表符分隔填'\t',多空格分隔可以改为逐行读取后用split()拆分
  • 确保CSV表头的Column1、Column2的大小写、前后空格和代码中读取的键完全一致,避免读取不到值的问题

内容的提问来源于stack exchange,提问作者Piu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 22:09:01