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

基于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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 17:20:31