本人已参与【新人创作礼】活动,一起开启掘金创作之路。 本文首发于CSDN
hello,大家好,我是wangzirui32,今天我们来学习如何用PyQt5设计一个文本编辑器窗体,开始学习吧!\
文章目录
1. UI窗体设计
首先,请确保你的Python解释器中已经安装了PyQt5和PyQt5-tools。
使用Designer的设计结果如下:
图片素材:
这里有几点需要说明,第一,文本框是由plainTextEdit控件实现的:
第二,工具栏是由Tool Button控件实现:
设置它的图标属性:(以打开按钮为例)
还有,每一个按钮对象的对象名(objectName)请设置为tool_图标文件名,如:tool_open, tool_save等。
最后,每一个工具栏按钮的说明是由Label控件实现,但是要将显示文件路径的Label控件的对象名设置为filepath。
UI及图片素材下载链接:download.csdn.net/download/wa…
2. 编写代码
2.1 pyuic生成代码
在命令行中输入以下命令:(注意:要切换到ui文件所在的目录)
pyuic5 -o window.py Text_Edit.ui
可以看到,在目录下生成了window.py。
2.2 修改window.py
新增代码如下:
# -*- coding: utf-8 -*-
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QMessageBox, QFileDialog
from os.path import isfile
import sys
class Ui_TextEdit(object):
def setupUi(self, TextEdit):
TextEdit.setObjectName("TextEdit")
......
QtCore.QMetaObject.connectSlotsByName(TextEdit)
# 自定义设置
self.open_filename = None
self.log_content = []
self.log_index = -1
def retranslateUi(self, TextEdit):
_translate = QtCore.QCoreApplication.translate
TextEdit.setWindowTitle(_translate("TextEdit", "Python文本编辑器"))
......
# 自定义函数
# 打开文件
def open_file(self):
self.open_filename = QtWidgets.QFileDialog.getOpenFileName(None, "打开", '', "文本文件 (*.txt)")[0]
self.filepath.setText(QtCore.QCoreApplication.translate("TextEdit", "文件路径:{}".format(self.open_filename)))
try:
with open(self.open_filename, encoding="UTF-8") as f:
self.file_content = f.read()
# 设置控件文本
self.plainTextEdit.setPlainText(self.file_content)
except Exception:
QMessageBox.warning(None, "警告", "打开文件发生错误,请稍后再试!")
# 另存为
def save_as_other_file(self):
# 获取文件路径
self.save_as_filename = QFileDialog.getSaveFileName(None, "另存为", '', '全部文件 (*.*)')[0]
try:
# 另存为其他文件
with open(self.save_as_filename, "w", encoding="UTF-8") as f:
f.write(self.plainTextEdit.toPlainText())
except Exception:
QMessageBox.warning(None, "警告", "另存为文件发生错误,请稍后再试!")
else:
QMessageBox.information(None, "提示", "另存为成功!")
# 保存
def save_file(self):
try:
with open(self.open_filename, "w", encoding="UTF-8") as f:
# 将控件内容写入文件
f.write(self.plainTextEdit.toPlainText())
except Exception:
QMessageBox.warning(None, "警告", "保存文件发生错误,请稍后再试!")
else:
QMessageBox.information(None, "提示", "保存成功!")
# 为记录列表添加一条记录
if len(self.log_content) == 5:
# 最多记录5条
del self.log_content[0]
self.log_content.append(self.plainTextEdit.toPlainText())
# 清空
def clear_content(self):
if QMessageBox.warning(None,
"警告",
"您确定这样做吗?",
QMessageBox.Yes | QMessageBox.No) == QMessageBox.Yes:
self.plainTextEdit.setPlainText("")
# 撤销
def recover_content(self):
try:
# 如果日志超出了列表范围
if (self.log_index - 1) < -5:
raise Exception
self.log_index -= 1
self.plainTextEdit.setPlainText(self.log_content[self.log_index])
except Exception:
QMessageBox.warning(None, "警告", "撤销文件发生错误,请稍后再试!")
else:
QMessageBox.information(None, "提示", "撤销成功!")
# 恢复
def unmake_content(self):
try:
# 如果日志超出了列表范围
if (self.log_index + 1) >= 0:
raise Exception
self.log_index += 1
self.plainTextEdit.setPlainText(self.log_content[self.log_index])
except Exception:
QMessageBox.warning(None, "警告", "恢复文件发生错误,请稍后再试!")
else:
QMessageBox.information(None, "提示", "恢复成功!")
# 退出
def exit_window(self):
if QMessageBox.information(None,
"提示",
"您确定退出吗?",
QMessageBox.Yes | QMessageBox.No) == QMessageBox.Yes:
sys.exit()
2.3 主项目文件代码
请务必将window.py放入主项目代码所处的文件夹中:
import sys
from PyQt5 import QtWidgets
from window import Ui_TextEdit
# 加载窗体
app = QtWidgets.QApplication(sys.argv)
window = QtWidgets.QMainWindow()
ui = Ui_TextEdit()
ui.setupUi(window)
# 加载按钮事件
ui.tool_open.clicked.connect(ui.open_file)
ui.tool_save.clicked.connect(ui.save_file)
ui.tool_clear.clicked.connect(ui.clear_content)
ui.tool_exit.clicked.connect(ui.exit_window)
ui.tool_save_as.clicked.connect(ui.save_as_other_file)
ui.tool_recover.clicked.connect(ui.recover_content)
ui.tool_unmake.clicked.connect(ui.unmake_content)
window.show()
sys.exit(app.exec_())
运行代码,就可以看到项目成果了。
好了,今天的课程就到这里,我是wangzirui32,喜欢的可以点个收藏和关注,我们下次再见!