使用Python和Tkinter库实现代码比较工具设计源码及打包使用介绍
本文介绍使用Python和Tkinter库实现的简单GUI界面代码比较工具。为便捷使用,用pyinstaller打包介绍。
比较工具设计源码
点击“加载文件1”和“加载文件2”按钮加载文件内容。
点击“比较”按钮,工具会黄色显示两个文件中不同的行。
移动垂直滚动条和水平滚动条都会同步:滚动一个文本框时,另一个文本框会同步滚动。
选项:支持忽略空格和忽略大小写的比较。
本程序使用了Python支持的标准库模块difflib。也就是说,difflib是 Python 标准库的一部分,不需要额外安装就可以import使用。difflib 模块可以用来找出两个文本之间的差异。这个模块提供了一些有用的类和函数来实现文本比较和差异化显示。difflib 模块官方文档 difflib --- 计算差异的辅助工具 — Python 3.13.1 文档
运行效果如下:
源码如下:
import tkinter as tk
from tkinter import filedialog, messagebox
import difflib
# 初始化主窗口
root = tk.Tk()
root.title("代码比较工具")
root.geometry("920x600")
# 文本区域框架
frame1 = tk.Frame(root)
frame1.grid(row=0, column=0, padx=10, pady=10)
frame2 = tk.Frame(root)
frame2.grid(row=0, column=1, padx=10, pady=10)
# 文本区域
text1 = tk.Text(frame1, wrap=tk.NONE, width=60, height=30)
text1.grid(row=0, column=0, sticky="nsew")
text2 = tk.Text(frame2, wrap=tk.NONE, width=60, height=30)
text2.grid(row=0, column=0, sticky="nsew")
# 纵向滚动条
scroll_y1 = tk.Scrollbar(frame1, orient=tk.VERTICAL, command=lambda *args: on_scroll_vertical(*args))
scroll_y1.grid(row=0, column=1, sticky="ns")
text1.config(yscrollcommand=scroll_y1.set)
scroll_y2 = tk.Scrollbar(frame2, orient=tk.VERTICAL, command=lambda *args: on_scroll_vertical(*args))
scroll_y2.grid(row=0, column=1, sticky="ns")
text2.config(yscrollcommand=scroll_y2.set)
# 横向滚动条
scroll_x1 = tk.Scrollbar(frame1, orient=tk.HORIZONTAL, command=lambda *args: on_scroll_horizontal(*args))
scroll_x1.grid(row=1, column=0, sticky="ew")
text1.config(xscrollcommand=scroll_x1.set)
scroll_x2 = tk.Scrollbar(frame2, orient=tk.HORIZONTAL, command=lambda *args: on_scroll_horizontal(*args))
scroll_x2.grid(row=1, column=0, sticky="ew")
text2.config(xscrollcommand=scroll_x2.set)
# 同步垂直滚动
def on_scroll_vertical(*args):
text1.yview(*args)
text2.yview(*args)
# 同步水平滚动
def on_scroll_horizontal(*args):
text1.xview(*args)
text2.xview(*args)
# 加载文件
def load_file(text_widget):
file_path = filedialog.askopenfilename()
if file_path:
try:
with open(file_path, 'r', encoding='utf-8') as file:
text_widget.delete(1.0, tk.END)