基于Python Tkinter实现Excel/CSV文件对比GUI工具开发求助
给Excel/CSV对比工具添加Tkinter图形界面
以下是给你的对比代码添加Tkinter GUI后的完整实现,解决了原代码硬编码路径的问题,支持可视化选择输入文件、输出路径,同时兼容Excel(.xlsx/.xls)和CSV格式,还加入了异常处理避免程序崩溃:
import pandas as pd import numpy as np import tkinter as tk from tkinter import filedialog, messagebox class FileComparerGUI: def __init__(self, root): self.root = root self.root.title("Excel/CSV 文件对比工具") # 初始化文件路径变量 self.file1_path = tk.StringVar() self.file2_path = tk.StringVar() # 构建界面元素 # 第一个文件选择区 tk.Label(root, text="选择第一个文件 (Excel/CSV):").grid(row=0, column=0, padx=10, pady=10, sticky="w") tk.Entry(root, textvariable=self.file1_path, width=50).grid(row=0, column=1, padx=10, pady=10) tk.Button(root, text="浏览", command=self.select_file1).grid(row=0, column=2, padx=10, pady=10) # 第二个文件选择区 tk.Label(root, text="选择第二个文件 (Excel/CSV):").grid(row=1, column=0, padx=10, pady=10, sticky="w") tk.Entry(root, textvariable=self.file2_path, width=50).grid(row=1, column=1, padx=10, pady=10) tk.Button(root, text="浏览", command=self.select_file2).grid(row=1, column=2, padx=10, pady=10) # 对比按钮 tk.Button(root, text="开始对比并生成结果", command=self.compare_files, bg="#4CAF50", fg="white").grid(row=2, column=0, columnspan=3, pady=20) # 状态提示标签 self.status_label = tk.Label(root, text="", fg="blue") self.status_label.grid(row=3, column=0, columnspan=3, pady=5) def select_file1(self): path = filedialog.askopenfilename(filetypes=[("Excel/CSV 文件", "*.xlsx *.xls *.csv")]) if path: self.file1_path.set(path) def select_file2(self): path = filedialog.askopenfilename(filetypes=[("Excel/CSV 文件", "*.xlsx *.xls *.csv")]) if path: self.file2_path.set(path) def read_file(self, file_path): """根据文件后缀读取Excel或CSV""" if file_path.endswith(('.xlsx', '.xls')): return pd.read_excel(file_path) elif file_path.endswith('.csv'): return pd.read_csv(file_path) else: raise ValueError("不支持的文件格式") def compare_files(self): file1 = self.file1_path.get() file2 = self.file2_path.get() if not file1 or not file2: messagebox.showwarning("提示", "请先选择两个要对比的文件") return try: self.status_label.config(text="正在读取文件...") self.root.update() df1 = self.read_file(file1) df2 = self.read_file(file2) # 检查两个DataFrame的行列数是否一致 if df1.shape != df2.shape: messagebox.showerror("错误", "两个文件的行数或列数不一致,无法对比") self.status_label.config(text="对比失败:行列数不匹配") return self.status_label.config(text="正在对比数据...") self.root.update() # 复用原对比逻辑 compare_values = df1.values == df2.values rows, cols = np.where(compare_values == False) for item in zip(rows, cols): df1.iloc[item[0], item[1]] = f"{df1.iloc[item[0], item[1]]} Not Equal {df2.iloc[item[0], item[1]]}" # 选择输出路径和文件名 output_path = filedialog.asksaveasfilename( defaultextension=".xlsx", filetypes=[("Excel 文件", "*.xlsx"), ("CSV 文件", "*.csv")] ) if not output_path: self.status_label.config(text="已取消保存") return self.status_label.config(text="正在保存结果文件...") self.root.update() # 根据输出后缀保存 if output_path.endswith('.xlsx'): df1.to_excel(output_path, index=False, header=True) elif output_path.endswith('.csv'): df1.to_csv(output_path, index=False, header=True, encoding='utf-8-sig') self.status_label.config(text="结果文件已成功生成!") messagebox.showinfo("成功", f"结果已保存至:\n{output_path}") except Exception as e: self.status_label.config(text=f"对比失败:{str(e)}") messagebox.showerror("错误", f"处理过程中出现异常:\n{str(e)}") if __name__ == "__main__": root = tk.Tk() app = FileComparerGUI(root) root.mainloop()
使用说明
- 运行程序后,点击「浏览」按钮分别选择两个要对比的Excel/CSV文件
- 确认文件路径无误后,点击「开始对比并生成结果」按钮
- 在弹出的窗口中选择结果文件的保存路径和格式(支持Excel或CSV)
- 等待程序完成,成功后会弹出提示并显示状态
新增特性
- 支持可视化选择输入输出文件,无需修改代码路径
- 兼容Excel(.xlsx/.xls)和CSV两种格式
- 添加了行列数校验,避免因文件结构不一致导致的错误
- 加入异常处理,捕获读取、对比、保存过程中的问题并给出提示
- 实时显示处理状态,提升用户体验
内容的提问来源于stack exchange,提问作者Shaik Bakshu
相关产品推荐
相关产品推荐

