分析
实现了一个简单的文本编辑器,使用pyqt5框架构建。以下是代码的主要功能和特点:
主窗口类 (mywindow)
继承自 qwidget 类。
使用 .ui 文件加载用户界面布局。
设置窗口标题、状态栏消息等。
创建菜单栏及其子菜单项(文件和编辑),并绑定相应的槽函数。
菜单操作
新建文件:清空文本编辑区域。
打开文件:通过文件对话框选择文件后读取其内容并显示在文本编辑区域。
保存文件:通过文件对话框选择保存位置并将文本编辑区域的内容写入文件。
退出程序:关闭窗口前询问是否保存当前文件。
语法高亮 (syntaxhighlighter)
继承自 qsyntaxhighlighter 类。
定义关键字、注释和字符串的格式规则。
实现 highlightblock 方法以根据定义的规则对每一行文本进行高亮处理。
运行程序
创建 qapplication 实例。
初始化 mywindow 窗口实例并展示。
进入应用程序的事件循环。
主要组件
uic: 用于从 .ui 文件加载 qt 用户界面。
qfiledialog: 提供打开和保存文件的对话框。
qmessagebox: 显示消息对话框以获取用户反馈。
qsyntaxhighlighter: 用于实现文本编辑区的语法高亮功能。
代码
from pyqt5 import uic
import sys
import re
from pyqt5.qtwidgets import qapplication, qwidget, qfiledialog, qmessagebox
from pyqt5.qtgui import qsyntaxhighlighter, qtextcharformat, qcolor, qfont
from pyqt5.qtcore import qregularexpression
class mywindow(qwidget):
def __init__(self):
super().__init__()
self.init_ui()
def init_ui(self):
self.ui = uic.loadui("./文本编辑器.ui")
print(self.ui.__dict__)
self.ui.setwindowtitle("文本编辑器") # 修改标题的名称
self.textedit = self.ui.textedit
self.syntaxhighlighter = syntaxhighlighter(self.textedit.document())
self.statusbar = self.ui.statusbar
self.statusbar().showmessage('状态栏')
# 加载好ui文件之后再进行设置菜单栏
menu = self.ui.menubar
file_menu = menu.addmenu("文件")
# 清空文本
self.create_file = file_menu.addaction("新建")
self.create_file.setshortcut('ctrl+n')
self.create_file.triggered.connect(self.newfile)
# 打开文件动作
self.open = file_menu.addaction("打开")
self.open.setshortcut("ctrl+o")
self.open.triggered.connect(self.openfile)
self.save = file_menu.addaction("保存")
self.save.setshortcut("ctrl+s")
self.save.triggered.connect(self.savefile)
self.exit = file_menu.addaction("退出")
self.exit.setshortcut("ctrl+e")
self.exit.triggered.connect(self.closeevent)
edit_menu = menu.addmenu("编辑")
edit_menu.addaction("复制")
edit_menu.addaction("粘贴")
edit_menu.addaction("剪切")
def newfile(self):
# 清空文本编辑区域
self.textedit.clear()
self.statusbar().showmessage('新文件')
def openfile(self):
# 打开文件对话框,读取文件内容,将其显示在textedit中
filename, _ = qfiledialog.getopenfilename(self, '打开文件', '', '文本文件 (*.txt);;所有文件 (*)')
if filename:
with open(filename, 'r', encoding='utf-8') as file:
self.textedit.settext(file.read())
self.statusbar().showmessage('打开新文件')
def savefile(self):
# 保存文件对话框,打开一个文件,将textedit中的内容写进去
filename, _ = qfiledialog.getsavefilename(self, '保存文件', '', '文本文件 (*.txt);;所有文件 (*)')
if filename:
with open(filename, 'w', encoding='utf-8') as file:
file.write(self.textedit.toplaintext())
def closeevent(self, event):
# 关闭窗口时提示保存
reply = qmessagebox.question(self, '退出', '你是否想保存文件?',
qmessagebox.yes | qmessagebox.no | qmessagebox.cancel, qmessagebox.cancel)
if reply == qmessagebox.yes:
self.savefile()
event.accept()
elif reply == qmessagebox.no:
event.accept()
else:
event.ignore()
class syntaxhighlighter(qsyntaxhighlighter):
def __init__(self, parent=none):
super().__init__(parent)
keywordformat = qtextcharformat()
keywordformat.setforeground(qcolor("blue"))
keywordformat.setfontweight(qfont.bold)
commentformat = qtextcharformat()
commentformat.setforeground(qcolor("green"))
commentformat.setfontitalic(true)
stringformat = qtextcharformat()
stringformat.setforeground(qcolor("red"))
stringformat.setfontweight(qfont.bold)
keywords = ["def", "class", "import", "from", "if", "else", "elif", "for", "while", "return", "try", "except"]
self.highlightingrules = []
for word in keywords:
escaped_word = re.escape(word)
rule = qregularexpression(rf"\b{escaped_word}\b")
self.highlightingrules.append((rule, keywordformat))
rule = qregularexpression(r"#[^\n]*")
self.highlightingrules.append((rule, commentformat))
rule = qregularexpression(r'"([^"\\]|\\.)*"')
self.highlightingrules.append((rule, stringformat))
def highlightblock(self, text):
for pattern, format in self.highlightingrules:
matchiterator = pattern.globalmatch(text)
while matchiterator.hasnext():
match = matchiterator.next()
self.setformat(match.capturedstart(), match.capturedlength(), format)
if __name__=="__main__":
app = qapplication(sys.argv)
w = mywindow()
# 展示窗口
w.ui.show()
app.exec()图示

到此这篇关于使用pyqt实现简易文本编辑器的文章就介绍到这了,更多相关pyqt文本编辑器内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论