1.效果
2.功能
1.找出两个文本中不同的地方
2.统计两个文本各自的字数(含符号与不含符号)
3.统计两文本之间相对重复率(含符号与不含符号)
3.代码
3.1 制定界面
用QTdesigner制作界面,保存成.ui文件。
回到Pycharm里用pyuic5转换为python代码:
pyuic5 compare.ui -o compare.py
转化完成的界面代码:
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'compare_2.ui'
#
# Created by: PyQt5 UI code generator 5.10.1
#
# WARNING! All changes made in this file will be lost!
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(1114, 830)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.plainTextEdit = QtWidgets.QPlainTextEdit(self.centralwidget)
self.plainTextEdit.setGeometry(QtCore.QRect(290, 10, 781, 301))
self.plainTextEdit.setObjectName("plainTextEdit")
self.pushButton_2 = QtWidgets.QPushButton(self.centralwidget)
self.pushButton_2.setGeometry(QtCore.QRect(810, 610, 211, 34))
self.pushButton_2.setObjectName("pushButton_2")
self.pushButton_3 = QtWidgets.QPushButton(self.centralwidget)
self.pushButton_3.setGeometry(QtCore.QRect(370, 610, 191, 34))
self.pushButton_3.setObjectName("pushButton_3")
self.plainTextEdit_4 = QtWidgets.QPlainTextEdit(self.centralwidget)
self.plainTextEdit_4.setGeometry(QtCore.QRect(290, 320, 781, 281))
self.plainTextEdit_4.setObjectName("plainTextEdit_4")
self.webEngineView = QtWebEngineWidgets.QWebEngineView(self.centralwidget)
self.webEngineView.setGeometry(QtCore.QRect(10, 10, 261, 761))
self.webEngineView.setUrl(QtCore.QUrl("about:blank"))
self.webEngineView.setObjectName("webEngineView")
self.textBrowser = QtWidgets.QTextBrowser(self.centralwidget)
self.textBrowser.setGeometry(QtCore.QRect(290, 660, 781, 111))
self.textBrowser.setObjectName("textBrowser")
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 1114, 30))
self.menubar.setObjectName("menubar")
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
self.pushButton_2.setText(_translate("MainWindow", "比较"))
self.pushButton_3.setText(_translate("MainWindow", "清空"))
from PyQt5 import QtWebEngineWidgets
3.2 程序
from sys import exit,argv
import difflib
import compare_ui2
import re
## 比较函数
def compare_file(file1, file2):
file1_content = file1
file2_content = file2
file1_content = file1_content.replace("\n", '').replace("\t", '')
file2_content = file2_content.replace("\n", '').replace("\t", '')
d = difflib.HtmlDiff()
result = d.make_file(file1_content, file2_content)
return result
## 绑定动作函数
def clicked():
text1 = ui.plainTextEdit.toPlainText()
text2 = ui.plainTextEdit_4.toPlainText()
result=compare_file(text1, text2)
# 要让html在PyQT界面显示,需要在html前后加上三引号
f = "'''" + result + "'''"
ui.webEngineView.setHtml(f)
calculate()
## 清空函数
def clean():
ui.plainTextEdit.clear()
ui.plainTextEdit_4.clear()
ui.textBrowser.clear()
##计数函数
def count_all():
text1 = ui.plainTextEdit.toPlainText()
text2 = ui.plainTextEdit_4.toPlainText()
com = difflib.Differ()
com = com.compare(text1, text2)
str = "".join(com)
text1_total=len(text1)
text2_total=len(text2)
text1_only = str.count("-")
text2_only=str.count("+")
return text1_only,text1_total,text2_only,text2_total
##计数函数(不含符号)
def count_ca():
text1 = ui.plainTextEdit.toPlainText()
text2 = ui.plainTextEdit_4.toPlainText()
#去掉文字以外的符号
text1 = re.sub("[\s+\.\!\/_,$%^*(+\"\')]+|[+——()?【】“”!,。?、~@#¥%……&*()]+", "", text1)
text2 = re.sub("[\s+\.\!\/_,$%^*(+\"\')]+|[+——()?【】“”!,。?、~@#¥%……&*()]+", "", text2)
com = difflib.Differ()
com = com.compare(text1, text2)
str = "".join(com)
text1_total=len(text1)
text2_total=len(text2)
text1_only=str.count("-")
text2_only=str.count("+")
return text1_only, text1_total, text2_only, text2_total
## 统计两文本的详细信息
def calculate():
text1_only, text1_total, text2_only, text2_total=count_all()
text1_caonly, text1_catotal, text2_caonly, text2_catotal=count_ca()
try:
text1_repetitive_rate=(text1_total-text1_only)/text1_total*100
text2_repetitive_rate=(text2_total-text2_only)/text2_total*100
text2ca_repetitive_rate=(text2_catotal-text2_caonly)/text2_catotal*100
text1ca_repetitive_rate=(text1_catotal-text1_caonly)/text1_catotal*100
ui.textBrowser.append("文本1总字数:" + str(text1_total))
ui.textBrowser.append("文本2总字数:" + str(text2_total))
ui.textBrowser.append("去掉所有符号后,文本1总字数:" + str(text1_catotal))
ui.textBrowser.append("去掉所有符号后,文本2总字数:" + str(text2_catotal))
ui.textBrowser.append("文本1独有字符数:" + str(text1_only))
ui.textBrowser.append("文本2独有字符数:" + str(text2_only))
ui.textBrowser.append("文本1相对于文本2的重复率为:" + str(text1_repetitive_rate) + "%")
ui.textBrowser.append("文本2相对于文本1的重复率为:" + str(text2_repetitive_rate) + "%")
ui.textBrowser.append("去掉所有符号后,文本2相对于文本1的重复率为:" + str(text2ca_repetitive_rate) + "%")
ui.textBrowser.append("去掉所有符号后,文本1相对于文本2的重复率为:" + str(text1ca_repetitive_rate) + "%")
except Exception as e:
ui.textBrowser.append("文本1或文本2为空;或其中一个文本仅有符号,没有字:" + str(e))
## 主程序
if __name__ == '__main__':
app = compare_ui2.QApplication(argv)
widgets = compare_ui2.QMainWindow()
ui = compare_ui2.Ui_MainWindow()
ui.setupUi(widgets)
try:
if ui.pushButton_2.isDown:
ui.pushButton_2.clicked.connect(clicked)
if ui.pushButton_3.isDown:
ui.pushButton_3.clicked.connect(clean)
except Exception as e:
ui.textBrowser.append("错误:" + str(e))
widgets.show()
exit(app.exec_())
4.程序打包
在Pycharm里使用pyinstaller打包:
pyinstaller -w compare.py
-w: 隐藏后台黑框
-f: 打包成一个文件,没有这个命令则打包成文件夹
我打包好的文件,可以下载直接使用:
链接: https://pan.baidu.com/s/17URrtWpY35WMZ0RAwxKHJQ
提取码: bryw