如何用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
相关产品推荐
相关产品推荐

