【PyQt】pyqt小案例实现简易文本编辑器

news2025/2/6 5:42:05

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 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()

图示:

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2293621.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2024最新版Node.js详细安装教程(含npm配置淘宝最新镜像地址)

一:Node.js安装 浏览器中搜索Nodejs,或直接用网址:Node.js — 在任何地方运行 JavaScript 建议此处下载长期支持版本(红框内): 开始下载,完成后打开文件: 进入安装界面,在此处勾选,再点击n…

【HTML入门】Sublime Text 4与 Phpstorm

文章目录 前言一、环境基础1.Sublime Text 42.Phpstorm(1)安装(2)启动Phpstorm(3)“启动”码 二、HTML1.HTML简介(1)什么是HTML(2)HTML版本及历史(3)HTML基本结构 2.HTML简单语法(1)HTML标签语法(2)HTML常用标签(3)表格(4)特殊字符 总结 前言 在当今的软件开发领域&#xff0c…

JVS低代码逻辑引擎多种业务场景触发案例配置:涵盖列表页按钮、表单数据、流程审批、外部API接口调用等

逻辑引擎作为JVS低代码开发套件的核心组件,专注于业务逻辑的快速构建与实现,它扮演着程序配置与执行的核心角色,适用于多样化的应用场景。该逻辑引擎设计灵活,能够通过多种配置方式被触发,以精准响应各类业务需求并实现…

RabbitMQ 从入门到精通:从工作模式到集群部署实战(一)

#作者:闫乾苓 文章目录 RabbitMQ简介RabbitMQ与VMware的关系架构工作流程RabbitMQ 队列工作模式及适用场景简单队列模式(Simple Queue)工作队列模式(Work Queue)发布/订阅模式(Publish/Subscribe&#xff…

计算机网络笔记再战——理解几个经典的协议4

目录 IP——网际协议 IP地址 1. A类地址 2. B类地址 3. C类地址 4. D类地址(组播地址) 5. E类地址(保留地址) 特殊地址与私有地址 广播地址 IP多播 子网掩码 传统分类与CIDR/VLSM的对比 路由控制 默认路由 主机路由…

Java CountDownLatch 用法和源码解析

🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/literature?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,…

两种文件类型(pdf/图片)打印A4半张纸方法

环境:windows10、Adobe Reader XI v11.0.23 Pdf: 1.把内容由横排变为纵排: 2.点击打印按钮: 3.选择打印页范围和多页: 4.内容打印在纸张上部 图片: 1.右键图片点击打印: 2.选择打印类型: 3.打印配置&am…

Vue3状态管理: Pinia使用技巧与最佳实践

Vue3状态管理: Pinia使用技巧与最佳实践 随着Web应用复杂度的提升,前端状态管理变得愈发重要。而在Vue3中,Pinia作为一种全新的状态管理工具,为我们提供了更加灵活和强大的状态管理解决方案。本文将从Pinia的基本概念入手,深入探讨…

stm32点灯 GPIO的输出模式

目录 1.选择RCC时钟 2.SYS 选择调试模式 SW 3.GPIO 配置 4.时钟树配置( 默认不变)HSI 高速内部时钟8Mhz 5.项目配置 6.代码 延时1s循环LED亮灭 1.选择RCC时钟 2.SYS 选择调试模式 SW 3.GPIO 配置 4.时钟树配置( 默认不变&#xff09…

腾讯会议win7二维码展示不出来

问题:win64更新后二维码展示不出来,手机等登陆都不行 安装所在位置创建文档命名TBSDEBUG并去掉后缀

swift 专题三 swift 规范一

一、Swift编码命名规范 对类、结构体、枚举和协议等类型的命名应该采用大驼峰法,如 SplitViewController。 文件名采用大驼峰法,如BlockOperation.swift。 对于扩展文件,有时扩展定义在一个独立的文件中,用“原始类型名 扩展名…

WPS计算机二级•幻灯片放映与会议

听说这是目录哦 放映PPT时常用的快捷技巧🥬设置放映模式🥕演讲备注的添加和隐藏🫚在PPT中插入附件并放映时打开🫛隐藏幻灯片 不被放映和打印🍄‍🟫演讲计时模式🥦能量站😚 放映PPT时…

FBX SDK的使用:基础知识

Windows环境配置 FBX SDK安装后,目录下有三个文件夹: include 头文件lib 编译的二进制库,根据你项目的配置去包含相应的库samples 官方使用案列 动态链接 libfbxsdk.dll, libfbxsdk.lib是动态库,需要在配置属性->C/C->预…

计算机网络笔记再战——理解几个经典的协议6——TCP与UDP

目录 先说端口号 TCP 使用序号保证顺序性和应答来保证有效性 超时重传机制 TCP窗口机制 UDP 路由协议 协议分类:IGP和EGP 几个经典的路由算法 RIP OSPF 链路状态数据库(LSDB) LSA(Link State Advertisement&#xff0…

【技海登峰】Kafka漫谈系列(二)Kafka高可用副本的数据同步与选主机制

【技海登峰】Kafka漫谈系列(二)Kafka高可用副本的数据同步与选主机制 一. 数据同步 在之前的学习中有了副本Replica的概念,解决了数据备份的问题。我们还需要面临一个设计难题即:如何处理分区中Leader与Follwer节点数据同步不匹配问题所带来的风险,这也是保证数据高可用的…

电商用户画像数据可视化分析

电商用户画像数据可视化分析 作者:i阿极 作者简介:Python领域新星作者、多项比赛获奖者:博主个人首页 😊😊😊如果觉得文章不错或能帮助到你学习,可以点赞👍收藏📁评论&am…

Vue3.5常用特性整理

Vue3.5 发布已近半年&#xff0c;抽空整理下常用的新增/改动特性 响应式 Props 解构 Vue3.5 中 Props 正式支持解构了&#xff0c;并添加了响应式跟踪 设置默认值 使用 JavaScript 原生的默认值语法声明 props 默认值 以前 const props withDefaults(defineProps<{ co…

2024年12月 Scratch 图形化(一级)真题解析 中国电子学会全国青少年软件编程等级考试

202412 Scratch 图形化&#xff08;一级&#xff09;真题解析 中国电子学会全国青少年软件编程等级考试 一、单选题(共25题&#xff0c;共50分) 第 1 题 点击下列哪个按钮&#xff0c;可以将红框处的程序放大&#xff1f;&#xff08; &#xff09; A. B. C. D. 标…

游戏引擎学习第87天

当直接使用内存时&#xff0c;可能会发生一些奇怪的事情 在直接操作内存时&#xff0c;一些意外的情况可能会发生。由于内存实际上只是一个大块的空间&#xff0c;开发者可以完全控制它&#xff0c;而不像高级语言那样必须遵守许多规则&#xff0c;因此很容易发生错误。在一个…

【物联网】ARM核常用指令(详解):数据传送、计算、位运算、比较、跳转、内存访问、CPSR/SPSR

文章目录 指令格式&#xff08;重点&#xff09;1. 立即数2. 寄存器位移 一、数据传送指令1. MOV指令2. MVN指令3. LDR指令 二、数据计算指令1. ADD指令1. SUB指令1. MUL指令 三、位运算指令1. AND指令2. ORR指令3. EOR指令4. BIC指令 四、比较指令五、跳转指令1. B/BL指令2. l…