如何用Python(tkinter+openpyxl)实现发票号查询Excel行并在GUI展示?
解决Excel发票号检索并显示的GUI问题
我帮你修正了代码,实现了输入发票号后检索Excel并在文本框显示对应行的功能,先看完整的工作代码:
from tkinter import * import openpyxl def find_invoice(): # 获取输入的发票号并去除首尾空格 invoice_num = inv_field.get().strip() if not invoice_num: result_text.delete(1.0, END) result_text.insert(END, "请输入有效的发票号!") return # 读取Excel文件,注意用原始字符串避免转义问题 path = r"E:\Library Management\issue.xlsx" try: wb = openpyxl.load_workbook(path) sheet = wb.active max_row = sheet.max_row max_col = sheet.max_column # 清空之前的结果 result_text.delete(1.0, END) found = False # 遍历所有行(从第2行开始,假设第1行是表头) for row in range(2, max_row + 1): # 假设发票号在第1列,根据实际情况修改column的值 cell_value = sheet.cell(row=row, column=1).value # 注意类型匹配,如果Excel里是数字,输入的是字符串需要转成int/float if str(cell_value).strip() == invoice_num: # 拼接该行所有列的内容 row_content = [] for col in range(1, max_col + 1): cell_obj = sheet.cell(row=row, column=col) row_content.append(str(cell_obj.value) if cell_obj.value else "") result_text.insert(END, "找到匹配行:\n" + "\t".join(row_content)) found = True break if not found: result_text.insert(END, f"未找到发票号为 {invoice_num} 的记录!") except Exception as e: result_text.delete(1.0, END) result_text.insert(END, f"出错了:{str(e)}") # 创建主窗口 a = Tk() a.title('Return Book') a.geometry('600x300') # 扩大窗口容纳文本框 # 构建GUI元素 heading = Label(a, text='Return Book', font=('Arial', 12, 'bold')) heading.grid(row=0, column=1, pady=10) lab1 = Label(a, text='Enter Invoice Number:') lab1.grid(row=1, column=0, padx=10, pady=5) inv_field = Entry(a, width=30) inv_field.grid(row=1, column=1, pady=5) # 查找按钮,绑定到自定义的find_invoice函数 find_btn = Button(a, text='Find', width=8, command=find_invoice) find_btn.grid(row=2, column=1, pady=10) # 结果显示文本框 result_text = Text(a, height=6, width=70, wrap=WORD) result_text.grid(row=3, column=0, columnspan=2, padx=10, pady=5) a.mainloop()
关键修改点说明:
- 解决函数名冲突:把原来的
find函数改名为find_invoice,避免和按钮变量名重复,同时按钮的command正确绑定到这个函数(原来绑定的是关闭窗口的a.destroy,完全错误)。 - 正确获取输入值:在函数内部通过
inv_field.get().strip()获取用户输入的发票号,还添加了空输入的判断。 - Excel遍历逻辑修正:遍历所有行(从第2行开始,假设第1行是表头),检查每行的发票号列(这里假设是第1列,你可以根据自己的Excel结构修改
column=1的数值)。 - 类型匹配处理:把Excel单元格的值转成字符串再和输入的发票号比较,避免因为数字/字符串类型不匹配导致找不到。
- 添加结果显示文本框:新增
Text组件用来显示检索结果,找到时展示整行内容,没找到时提示用户,出错时显示错误信息。 - 路径转义处理:用原始字符串
r"路径"避免反斜杠转义问题,防止读取文件失败。 - 异常处理:包裹了Excel读取的代码,捕获可能的错误(比如文件不存在、路径错误),给用户友好提示。
你只需要根据自己的Excel文件调整发票号所在的列号,以及窗口大小等样式,就能正常使用啦!
内容的提问来源于stack exchange,提问作者The_Py_prog
相关产品推荐
相关产品推荐

