其实之前已经实现了使用盘古规范文本格式的业务代码。主要可以规范中文文本文档中的文字和标点符号。阅读全文,不过为了方便,我们这里用Qt5做成一个可操作的页面应用,让不熟悉python的朋友不用写代码直接双击运行就OK了。为了让文本格式的美化过程不影响主线程的使用,专门使用QThread子线程来运行文本文档美化的业务流程,然后安装所有需要的非标准模块点子。pipinstall-ihttps://pypi.tuna.tsinghua.edu.cn/simplepangupipinstall-ihttps://pypi.tuna.tsinghua.edu.cn/simplePyQt5制作我们使用的pyqt5应用模块和业务模块pangu被导入到我们的代码块中。#它将PyQt5.QtCore模块的所有类、属性和方法导入到全局符号表中。fromPyQt5.QtCoreimport*#将PyQt5.QtWidgets模块的所有类、属性、方法导入到全局符号表中。,QFileDialog#将PyQt5.QtGui模块的所有类、属性和方法从sym导入全局Qtable.QtGuiimportQIcon,QFont,QTextCursor#导入盘古模块.importpangu#导入sys模块.importsys#导入了os模块.importos为了减少python模块打包时过多的资源占用,在输入exe的情况下应用程序占用空间太大,这次我们只导入相关的python类可以用过的。请注意这个小细节。接下来创建一个名为PanGuUI的python类实现整个应用页面的开发,将页面布局和组件相关的部分写到这个类中。并将相应的slot函数绑定到页面组件上,实现页面的“点击”等功能。#它创建了一个名为PanGuUI的类,该类继承自QWidget.classPanGuUI(QWidget):def__init__(self):"""构造函数。当从类创建对象时调用它,它允许类初始化属性"""super(PanGuUI,self).__init__()self.init_ui()definit_ui(self):"""这个函数初始化UI。"""self.setWindowTitle('文档美化器公众号:Python集中营')self.setWindowIcon(QIcon('txt.ico'))self.brower=QTextBrowser()self.brower.setFont(QFont('宋体',8))self.brower.setReadOnly(True)self.brower.setPlaceholderText('处理进展显示区域...')self.brower.ensureCursorVisible()self.txt_file_path=QLineEdit()self.txt_file_path.setPlaceholderText('源文档路径')self.txt_file_path.setReadOnly(True)self.txt_file_path_btn=QPushButton()self.txt_file_path_btn.setText('导入')self.txt_file_path_btn.clicked.connect(self.txt_file_path_btn_click)self.new_txt_file_path=QLineEdit()self.new_txt_file_path.setPlaceholderText('新文本文件路径')self.new_txt_file_path.setReadOnly(True)self.new_txt_file_path_btn=QPushButton()self.new_txt_file_path_btn.setText('路径')self.new_txt_file_path_btn.clicked.connect(self.new_txt_file_path_btn_click)self.start_btn=QPushButton()self.start_btn.setText('开始引导')self.start_btn.clicked.connect(self.start_btn_click)hbox=QHBoxLayout()hbox.addWidget(self.brower)fbox=QFormLayout()fbox.addRow(self.txt_file_path,self.txt_file_path_btn)fbox.addRow(self.new_txt_file_path,self.new_txt_file_path_btn)v_vbox=QVBoxLayout()v_vbox.addWidget(self.start_btn)vbox=QVBoxLayout()vbox.addLayout(fbox)vbox.addLayout(v_vbox)hbox.addLayout(vbox)self.thread_=PanGuThread(self)self.thread_.message.connect(self.show_message)self.thread_.finished.connect(self.finshed)self.setLayout(hbox)defshow_message(self,text):"""显示一条消息:paramtext:要显示的文本"""cursor=self.brower.textCursor()cursor.movePosition(QTextCursor.End)self.brower.append(text)self.brower.setTextCursor(cursor)self.brower.ensureCursorVisible()deftxt_file_path_btn_click(self):"""打开文件对话框并允许用户选择文件。"""txt_file=QFileDialog.getOpenFileName(self,os.getcwd(),'打开文档','文本文件(*.txt)')self.txt_file_path.setText(txt_file[0])defnew_txt_file_path_btn_click(self):"""这个函数打开一个文件对话框,允许用户选择一个文件来保存输出。"""new_txt_file=QFileDialog.getOpenFileName(self,os.getcwd(),'打开文本文档','TextFile(*.txt)')self.new_txt_file_path.setText(new_txt_file[0])defstart_btn_click(self):"""单击开始按钮时调用的函数。"""self.thread_.start()self.start_btn.setEnabled(False)deffinished(self,finished):""":paramfinished:一个布尔值,如果下载完成则为True,否则为False"""如果完成为True:self.start_btn.setEnabled(True)创建一个名为PanGuThread的子线程,将实现美化和格式化文本字符串的业务代码块写入该子线程子线程继承了QThread的PyQt5线程类。通过创建子线程,将子线程的信号信息传递给主线程,可以在主线程的文本浏览器中显示出来,达到实时跟踪执行结果的效果。#该类是QThread的子类,用于将文本拆分成words初始化类。:paramparent:Theparentwidget"""super(PanGuThread,self).__init__(parent)self.working=Trueself.parent=parentdef__del__(self):"""一个析构函数。它是当对象被销毁时调用。"""self.working=Trueself.wait()defrun(self)->None:""">Thisfunctionrunstheprogram"""try:txt_file_path=self.parent.txt_file_path.text().strip()self.message.emit('源文件路径信息读取取正常!')new_txt_file_path=self.parent.new_txt_file_path.text().strip()self.message.emit('新文件路径信息正常读取!')list_=[]withopen(txt_file_path,encoding='utf-8')asf:lines_=f.readlines()self.message.emit('源文件内容已读取!')n=1forline_inlines_:text=pangu.spacing_text(line_)self.message.emit('第{0}行文档内容已格式化!'.format(n))list_.append(text)n=n+1self.message.emit('源文件路径信息被格式化!')self.message.emit('格式化后的内容将被写入到一个新的filesoon!')withopen(new_txt_file_path,'a')asf:forline_inlist_:f.write(line_+'\n')self.message.emit('新文件内容已写入!')self.finished.emit(True)exceptExceptionase:self.message.emit('读取或格式化文件内容时发生异常!')if__name__=='__main__':app=QApplication(sys.argv)main=PanGuUI()main.show()sys.exit(app.exec_())finished开发开始测试效果。创建两个文本文件data.txt和new_data.txt。点击“开始运行”后,会调用整个业务子线程实现文本格式化。结果运行完美。来看看执行过程展示【上期】精彩】pyqt5应用的主题风格!GUI应用:socket互联网聊天室!小王,给这2000位顾客发一封节日祝福的邮件……
