用python写一段代码,在windows上运行,使用tkinter,用于比较两段很长的文本content1和content2的差异,content1可加载指定路径的文件。程序能够在可视化界面上展示差异项,展示的窗口分为左界面和右界面,左右界面有各自的水平滚动条控件,左右界面共用一个垂直滚动条控件,左界面显示content1,右界面显示content2,左界面和右界面内容中,存在差异的部分,用颜色进行标记。
时间: 2024-03-13 15:46:32 浏览: 143
好的,下面是代码实现:
```python
import tkinter as tk
from tkinter import filedialog
from difflib import Differ
class TextCompare(tk.Frame):
def __init__(self, master):
super().__init__(master)
self.master = master
self.master.title("文本比较工具")
self.master.geometry("800x600")
self.master.resizable(True, True)
self.grid(sticky="NEWS")
self.create_widgets()
def create_widgets(self):
# 创建菜单栏
menubar = tk.Menu(self.master)
filemenu = tk.Menu(menubar, tearoff=0)
filemenu.add_command(label="打开文件1", command=self.open_file1)
filemenu.add_command(label="打开文件2", command=self.open_file2)
menubar.add_cascade(label="文件", menu=filemenu)
self.master.config(menu=menubar)
# 创建滚动条控件
self.vbar = tk.Scrollbar(self, orient=tk.VERTICAL)
self.vbar.grid(row=0, column=2, sticky="NS")
self.left_hbar = tk.Scrollbar(self, orient=tk.HORIZONTAL)
self.left_hbar.grid(row=1, column=0, sticky="EW")
self.right_hbar = tk.Scrollbar(self, orient=tk.HORIZONTAL)
self.right_hbar.grid(row=1, column=1, sticky="EW")
# 创建文本框控件
self.left_text = tk.Text(self, wrap=tk.NONE, yscrollcommand=self.vbar.set, xscrollcommand=self.left_hbar.set)
self.left_text.grid(row=0, column=0, sticky="NEWS")
self.left_hbar.config(command=self.left_text.xview)
self.vbar.config(command=self.scroll_text)
self.left_text.config(state=tk.DISABLED)
self.right_text = tk.Text(self, wrap=tk.NONE, yscrollcommand=self.vbar.set, xscrollcommand=self.right_hbar.set)
self.right_text.grid(row=0, column=1, sticky="NEWS")
self.right_hbar.config(command=self.right_text.xview)
self.right_text.config(state=tk.DISABLED)
def open_file1(self):
file_path = filedialog.askopenfilename()
if file_path:
with open(file_path, encoding="utf-8") as f:
self.content1 = f.readlines()
self.show_content()
def open_file2(self):
file_path = filedialog.askopenfilename()
if file_path:
with open(file_path, encoding="utf-8") as f:
self.content2 = f.readlines()
self.show_content()
def show_content(self):
if hasattr(self, "content1") and hasattr(self, "content2"):
self.left_text.config(state=tk.NORMAL)
self.right_text.config(state=tk.NORMAL)
differ = Differ()
diff = list(differ.compare(self.content1, self.content2))
self.left_text.delete("1.0", tk.END)
self.right_text.delete("1.0", tk.END)
for line in diff:
if line.startswith("-"):
self.left_text.insert(tk.END, line[2:], "delete")
elif line.startswith("+"):
self.right_text.insert(tk.END, line[2:], "insert")
else:
self.left_text.insert(tk.END, line[2:])
self.right_text.insert(tk.END, line[2:])
self.left_text.tag_config("delete", foreground="red")
self.right_text.tag_config("insert", foreground="blue")
self.left_text.config(state=tk.DISABLED)
self.right_text.config(state=tk.DISABLED)
def scroll_text(self, *args):
self.left_text.yview(*args)
self.right_text.yview(*args)
if __name__ == "__main__":
root = tk.Tk()
app = TextCompare(root)
app.mainloop()
```
解释一下代码:
我们首先定义了一个 TextCompare 类,这个类继承自 tk.Frame,并在 __init__ 方法中初始化了界面,包括菜单栏、滚动条控件和文本框控件等。
在 create_widgets 方法中,我们创建了菜单栏、滚动条控件和文本框控件,并将它们放置在界面上。
在 open_file1 和 open_file2 方法中,我们通过 filedialog 模块打开文件对话框,选择需要比较的两个文件,并将它们的内容读取到内存中。
在 show_content 方法中,我们使用 difflib 模块中的 Differ 类来比较两个文件的内容,得到它们的差异,并将差异显示在界面上。其中,我们用红色标记删除内容,用蓝色标记新增内容。
最后,在 scroll_text 方法中,我们将两个文本框的垂直滚动条控件关联起来,以便它们能够同时滚动。
这样,我们就完成了一个简单的文本比较工具。
阅读全文