Tkinter商品信息查询工具:CSV描述数据显示错误问题排查
商品信息查询工具问题排查与修复
问题描述
使用csv和tkinter开发商品信息查询工具,搜索功能可运行,但描述数据显示异常:输入条码搜索后,标签仅显示pice,无法正确展示商品的Test描述,价格显示正常。怀疑问题出在find函数的条码匹配循环(原代码第26-30行),但无法写出正确代码。
原代码
import csv import tkinter from tkinter import * CsvFile = "products.csv" main = Tk() main.geometry('500x500') Entry1 = Entry(main, width = 20) Entry1.pack() lbl = Label(main, text = "a") lbl.pack() lb2 = Label(main, text = "a") lb2.pack() lb3 = Label(main, text = "a") lb3.pack() def find(): with open(CsvFile) as csvcsv: reader = csv.DictReader(csvcsv) barcode = Entry1.get() for row in reader: if barcode == row['barcode1']: for desc, pice in row.items(): lbl.config(text = desc) lb2.config(text = pice) break else: lbl.config(text='This Product is currently unavailable') Button(main, text='search', command = find).place(x=100, y=170) main.mainloop()
CSV文件内容
barcode desc pice 1111111 Test $5.00
问题分析
- 字段名不匹配:CSV表头为
barcode,但代码中用row['barcode1']做匹配,直接导致条码匹配逻辑失效。 - 字段遍历逻辑错误:找到匹配行后,通过
for desc, pice in row.items()遍历所有字段,会循环覆盖标签内容。最后一次循环会把描述标签设为字段名pice,价格标签设为$5.00,这就是描述显示异常的原因。 - 错误提示时机错误:原代码每遍历一行不匹配就更新提示,会导致还没遍历完所有行就提前显示“商品不可用”。
修正后的代码
import csv import tkinter from tkinter import * CsvFile = "products.csv" main = Tk() main.geometry('500x500') Entry1 = Entry(main, width=20) Entry1.pack() # 明确标签用途,设置初始文本 lbl_desc = Label(main, text="商品描述:") lbl_desc.pack() lbl_price = Label(main, text="商品价格:") lbl_price.pack() lbl_status = Label(main, text="") lbl_status.pack() def find(): # 重置状态提示 lbl_status.config(text="") barcode = Entry1.get().strip() # 去除输入首尾空格 found = False # 处理CSV分隔符:Excel保存的空格分隔文件需指定delimiter=' ',若为制表符则用delimiter='\t' with open(CsvFile, newline='', encoding='utf-8') as csvfile: reader = csv.DictReader(csvfile, delimiter=' ') for row in reader: # 匹配正确的字段名barcode,同时去除内容空格 if barcode == row['barcode'].strip(): # 直接通过字段名获取对应值 lbl_desc.config(text=f"商品描述:{row['desc'].strip()}") lbl_price.config(text=f"商品价格:{row['pice'].strip()}") found = True break # 遍历完成后统一判断是否找到商品 if not found: lbl_status.config(text='该商品目前无库存') # 重置描述和价格标签 lbl_desc.config(text="商品描述:") lbl_price.config(text="商品价格:") Button(main, text='搜索', command=find).place(x=100, y=170) main.mainloop()
关键修复点
- 修正字段名匹配:将
row['barcode1']改为row['barcode'],与CSV表头保持一致。 - 移除错误的字段遍历循环:直接通过字段名
row['desc']和row['pice']获取对应值,避免循环覆盖标签。 - 调整错误提示逻辑:先标记是否找到商品,遍历完所有行后再显示提示,避免提前触发错误信息。
- 处理空格问题:用
strip()去除输入和CSV内容的首尾空格,防止因空格导致匹配失败。 - 优化标签可读性:给标签明确命名并设置初始文本,提升界面清晰度。
内容的提问来源于stack exchange,提问作者Lord_Kordec
相关产品推荐
相关产品推荐

