【PyQt】pyqt小案例实现简易文本编辑器
pyqt小案例实现简易文本编辑器
分析
实现了一个简单的文本编辑器,使用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 QRegularExpressionclass 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.textEditself.syntaxHighlighter = SyntaxHighlighter(self.textEdit.document())self.statusBar = self.ui.statusBarself.statusBar().showMessage('状态栏')# 加载好ui文件之后再进行设置菜单栏menu = self.ui.menubarfile_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小案例实现简易文本编辑器
pyqt小案例实现简易文本编辑器 分析 实现了一个简单的文本编辑器,使用PyQt5框架构建。以下是代码的主要功能和特点: 主窗口类 (MyWindow): 继承自 QWidget 类。使用 .ui 文件加载用户界面布局。设置窗口标题、状态栏消息等。创建菜单栏及其子菜单项&…...

二叉树03(数据结构初阶)
文章目录 一:实现链式结构二叉树1.1前中后序遍历1.1.1遍历规则1.1.2代码实现 1.2结点个数以及高度等1.2.1二叉树结点个数1.2.2二叉树叶子结点个数1.2.3二叉树第k层结点个数1.2.4二叉树的深度/高度1.2.5 二叉树查找值为x的结点1.2.6二叉树的销毁 1.3层序遍历1.4判断是…...

ComfyUI工作流 图像反推生成人像手办人像参考(SDXL版)
文章目录 图像反推生成人像手办人像参考SD模型Node节点工作流程效果展示开发与应用图像反推生成人像手办人像参考 本工作流旨在通过利用 Stable Diffusion XL(SDXL)模型和相关辅助节点,实现高效的人像参考生成和手办设计。用户可通过加载定制的模型、LORA 调整和控制节点对…...

【01】共识机制
BTF共识 拜占庭将军问题 拜占庭将军问题是一个共识问题 起源 Leslie Lamport在论文《The Byzantine Generals Problem》提出拜占庭将军问题。 核心描述 军中可能有叛徒,却要保证进攻一致,由此引申到计算领域,发展成了一种容错理论。随着…...
sentinel的限流原理
Sentinel 的限流原理基于 流量统计 和 流量控制策略,通过动态规则对系统资源进行保护。其核心设计包括以下几个关键点: 流量统计模型:滑动时间窗口 Sentinel 使用 滑动时间窗口算法 统计单位时间内的请求量,相比传统的固定时间窗…...

ZOJ 1007 Numerical Summation of a Series
原题目链接 生成该系列值的表格 对于x 的 2001 个值,x 0.000、0.001、0.002、…、2.000。表中的所有条目的绝对误差必须小于 0.5e-12(精度为 12 位)。此问题基于 Hamming (1962) 的一个问题,当时的大型机按今天的微型计算机标准来…...
『 C 』 `##` 在 C 语言宏定义中的作用解析
文章目录 ## 运算符的基本概念可变参数宏与 ## 的应用可变参数宏简介## 处理可变参数的两种情况可变参数列表为空可变参数列表不为空 示例代码验证 在 C 和 C 编程里,宏定义是个很有用的工具。今天咱们就来聊聊 ## 这个预处理器连接运算符在宏定义中的作用ÿ…...
独立成分分析 (ICA):用于信号分离或降维
人工智能例子汇总:AI常见的算法和例子-CSDN博客 独立成分分析 (Independent Component Analysis, ICA) 是一种用于信号分离和降维的统计方法,常用于盲源分离 (Blind Source Separation, BSS) 问题,例如音频信号分离或脑电信号 (EEG) 处理。…...
为什么会有函数调用参数带标签的写法?Swift函数调用的参数传递需要加前缀是否是冗余?函数调用?函数参数?
为什么会有函数调用参数带标签的写法? ObjC函数参数形式与众不同,实参前会加前缀,尤其参数很多的情况,可读性很强。例如: [person setAge: 29 setSex:1 setClass: 35]; 这种参数前面加前缀描述也被叫标签(Label). 注意࿰…...

实际操作 检测缺陷刀片
号he 找到目标图像的缺陷位置,首先思路为对图像进行预处理,灰度-二值化-针对图像进行轮廓分析 //定义结构元素 Mat se getStructuringElement(MORPH_RECT, Size(3, 3), Point(-1, -1)); morphologyEx(thre, tc, MORPH_OPEN, se, Point(-1, -1), 1); …...

使用Pygame制作“青蛙过河”游戏
本篇博客将演示如何使用 Python Pygame 从零开始编写一款 Frogger 风格的小游戏。Frogger 是一款早期街机经典,玩家需要帮助青蛙穿越车水马龙的马路到达对岸。本示例提供了一个精简原型,包含角色移动、汽车生成与移动、碰撞检测、胜利条件等关键点。希望…...

BUU17 [RoarCTF 2019]Easy Calc1
自用 源代码 $(#calc).submit(function(){$.ajax({url:"calc.php?num"encodeURIComponent($("#content").val()),type:GET,success:function(data){$("#result").html(<div class"alert alert-success"><strong>答案:&l…...

堆的实现——对的应用(堆排序)
文章目录 1.堆的实现2.堆的应用--堆排序 大家在学堆的时候,需要有二叉树的基础知识,大家可以看我的二叉树文章:二叉树 1.堆的实现 如果有⼀个关键码的集合 K {k0 , k1 , k2 , …,kn−1 } ,把它的所有元素按完全⼆叉树…...
新生讲课——图和并查集
1.图的存储 (1).邻接矩阵 邻接矩阵可以借助stl中的vector,我们通过开一个二维矩阵,g[u]中存储的是u可以到达的点,定义如下 const int N 2e5 10; vector<int> g[N] 若是遇到带权图则定义如下 const int N 2e5 10; vector <pair <int ,…...

基于深度学习的视觉检测小项目(十七) 用户管理后台的编程
完成了用户管理功能的阶段。下一阶段进入AI功能相关。所有的资源见文章链接。 补充完后台代码的用户管理界面代码: import sqlite3from PySide6.QtCore import Slot from PySide6.QtWidgets import QDialog, QMessageBoxfrom . import user_manage # 导入使用ui…...
实战:利用百度站长平台加速网站收录
本文转自:百万收录网 原文链接:https://www.baiwanshoulu.com/33.html 利用百度站长平台加速网站收录是一个实战性很强的过程,以下是一些具体的步骤和策略: 一、了解百度站长平台 百度站长平台是百度为网站管理员提供的一系列工…...

web-XSS-CTFHub
前言 在众多的CTF平台当中,作者认为CTFHub对于初学者来说,是入门平台的不二之选。CTFHub通过自己独特的技能树模块,可以帮助初学者来快速入门。具体请看官方介绍:CTFHub。 作者更新了CTFHub系列,希望小伙伴们多多支持…...

【C++】P1957 口算练习题
博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 💯前言💯题目描述输入格式:输出格式: 💯我的做法代码实现: 💯老师的做法代码实现: 💯对比分析&am…...

第二十三章 MySQL锁之表锁
目录 一、概述 二、语法 三、特点 一、概述 表级锁,每次操作锁住整张表。锁定粒度大,发生锁冲突的概率最高,并发度最低。应用在MyISAM、InnoDB、BDB等存储引擎中。 对于表级锁,主要分为以下三类: 1. 表锁 2. 元数…...

linux 进程补充
环境变量 基本概念 环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数 如:我们在编写C/C代码的时候,在链接的时候,从来不知道我们的所链接的动态静态库在哪 里,但是照样可以链接成功&#…...
【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15
缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下: struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...
进程地址空间(比特课总结)
一、进程地址空间 1. 环境变量 1 )⽤户级环境变量与系统级环境变量 全局属性:环境变量具有全局属性,会被⼦进程继承。例如当bash启动⼦进程时,环 境变量会⾃动传递给⼦进程。 本地变量限制:本地变量只在当前进程(ba…...

【大模型RAG】Docker 一键部署 Milvus 完整攻略
本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装;只需暴露 19530(gRPC)与 9091(HTTP/WebUI)两个端口,即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...
【磁盘】每天掌握一个Linux命令 - iostat
目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat(I/O Statistics)是Linux系统下用于监视系统输入输出设备和CPU使…...

1.3 VSCode安装与环境配置
进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件,然后打开终端,进入下载文件夹,键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...

高等数学(下)题型笔记(八)空间解析几何与向量代数
目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...

Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)
引言:为什么 Eureka 依然是存量系统的核心? 尽管 Nacos 等新注册中心崛起,但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制,是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...

Redis数据倾斜问题解决
Redis 数据倾斜问题解析与解决方案 什么是 Redis 数据倾斜 Redis 数据倾斜指的是在 Redis 集群中,部分节点存储的数据量或访问量远高于其他节点,导致这些节点负载过高,影响整体性能。 数据倾斜的主要表现 部分节点内存使用率远高于其他节…...
安卓基础(aar)
重新设置java21的环境,临时设置 $env:JAVA_HOME "D:\Android Studio\jbr" 查看当前环境变量 JAVA_HOME 的值 echo $env:JAVA_HOME 构建ARR文件 ./gradlew :private-lib:assembleRelease 目录是这样的: MyApp/ ├── app/ …...

Chromium 136 编译指南 Windows篇:depot_tools 配置与源码获取(二)
引言 工欲善其事,必先利其器。在完成了 Visual Studio 2022 和 Windows SDK 的安装后,我们即将接触到 Chromium 开发生态中最核心的工具——depot_tools。这个由 Google 精心打造的工具集,就像是连接开发者与 Chromium 庞大代码库的智能桥梁…...