使用 PyQt5 和 Python 构建记事本

2025年03月17日 | 阅读 22 分钟

记事本不需要太多介绍。它是一个通用文本编辑器,允许用户打开、阅读、创建和编辑纯文本文件。它自 Microsoft Windows 问世以来一直是其中的一部分,类似的应用程序存在于每个开发的 GUI 桌面中。

在下面的教程中,我们将借助 PyQt5 库,用 Python 编程语言创建一个记事本的副本。

但在我们开始之前,让我们简要介绍一下 PyQt5 库。

PyQt5 简介

PyQt5 是一个图形用户界面 (GUI) 工具包,它是一组适用于 Qt v5 的 Python 绑定,兼容多种操作系统,如 Windows、Unix、Linux、macOS、Android 和 iOS。PyQt5 库因其工具和简洁性,使我们能够轻松开发交互式桌面应用程序。

一个 GUI 应用程序由前端和后端组成。PyQt5 提供了一个名为“QtDesigner”的工具,它使用拖放方法来设计前端,从而加快开发速度,让开发者可以将更多时间花在后端工作上。

使用 pip 安装 PyQt5

为了安装 Python 模块,我们需要 'pip',这是一个管理安装来自受信任公共存储库的模块所需的包的框架。一旦我们有了 'pip',我们就可以使用 Windows 命令提示符 (CMD) 或终端中的命令安装 pyqt5 模块,如下所示:

语法

验证安装

模块安装完成后,我们可以通过创建一个空的 Python 程序文件并写入如下 import 语句来验证它:

文件:verify.py

现在,保存上述文件并在终端中使用以下命令执行它:

语法

如果上述 Python 程序文件未返回任何错误,则模块已正确安装。但是,如果引发异常,请尝试重新安装模块,并且还建议参考模块的官方文档。

现在让我们开始构建项目。

项目先决条件

要开始使用 PyQt5 和 Python 构建记事本,需要具备该语言语法和函数的基本知识。由于 Python 是一种高级解释型面向对象编程语言,我们还将使用类和对象的概念。此外,以下是我们将在整个项目中使用的模块:

  1. PyQt5: 此模块将允许我们创建应用程序的图形用户界面。
  2. sys: 此模块将提供不同的函数和变量来操纵 Python 运行时环境的不同部分。
  3. os: 此模块将提供与操作系统交互的函数。

用 Python 构建记事本应用程序

我们将从创建一个名为“My Notepad”的新文件夹开始。在这个文件夹中,我们将创建另一个名为“icons”的文件夹,它将包含项目所需的所有图标,以及一个名为“main.py”的 Python 程序文件,我们将在其中编写项目的源代码。

图标是可选的,可以用来让应用程序看起来更具吸引力。您可以选择自己喜欢的图标,也可以从以下链接下载我们在此项目中使用的包含图标的 ZIP 文件:点击此处下载

现在我们已经为应用程序设置了结构,是时候打开 'main.py' 文件并开始编码部分了。为了使概念清晰易懂,我们将完整的项目代码分为不同的部分。

以下是我们将在项目中所采取的步骤。

步骤 1: 首先,我们将导入项目所需的模块。

步骤 2: 其次,我们将创建应用程序的主窗口。

步骤 3: 然后,我们将文本编辑器和容器添加到窗口中。

步骤 4: 之后,我们将创建菜单和工具栏。

步骤 5: 最后,我们将定义必要的函数并设置事件触发器。

让我们详细了解这些函数。

导入项目所需的模块

我们将首先导入所有必要的模块,如 sysos。我们还将从 PyQt5 模块的不同模块中导入各种类。

让我们考虑以下说明相同内容的代码片段。

文件:main.py

说明

在上述代码片段中,我们导入了 sysos 模块。然后,我们从 PyQt5 模块的 QtWidgets、QtGui、QtCoreQtPrintSupport 模块中导入了所有必要的类。

创建应用程序的主窗口

现在我们已经成功导入了项目所需的所有模块和类,是时候创建应用程序的主窗口了。我们将创建一个 QMainWindow 子类,并定义一个初始化函数来配置窗口的标题、几何图形和图标。

文件:main.py

说明

在上面的代码片段中,我们定义了 QMainWindow 类的一个子类。在这个类中,我们定义了一个初始化函数来初始化一些变量及其默认值。我们还继承了父类的方法。在这个函数中,我们配置了应用程序的标题,并定义了应用程序的初始宽度和高度。然后我们设置了窗口图标,并使用 resize() 函数来设置应用程序的几何图形。

然后我们实例化了我们创建的类,并使用 show() 方法来显示结果窗口。我们还使用了 sys 模块的 exit() 函数来操作应用程序的关闭。

向应用程序添加文本编辑器和容器

我们现在将添加一些过滤器类型、默认目标以及显示字体样式和大小。我们还将创建一个主布局,在其中添加文本编辑器和其他必要的部件。我们还将创建一个容器来封装应用程序的主布局。

让我们考虑以下说明相同内容的代码片段。

文件:main.py

说明

在上面的代码片段中,我们为编辑器定义了一些过滤器类型。我们还初始化了目录中的默认路径和字体样式。然后我们创建了一个 QVBoxLayout 类的对象。接着我们创建了一个文本编辑器,将其字体样式设置为初始化的字体,并将这个编辑器对象添加到窗口的主布局中。然后我们使用 statusBar() 方法创建了一个状态栏。我们还使用 QWidget 类创建了一个应用程序容器,并使用 setLayout() 方法设置了容器的主布局。

创建菜单和工具栏

我们现在将创建菜单和工具栏。这些菜单和工具栏将帮助我们对文本执行不同的操作。为了保持简单,我们将创建一个“文件”菜单,其中包含文件处理操作,以及一个“编辑”菜单,其中包含编辑器处理操作及其各自的工具栏。我们将在“文件”菜单中包含打开、保存、另存为和打印等操作,而在“编辑”菜单中包含撤消、重做、清除、剪切、复制、粘贴、全选和换行等操作。

文件菜单及其工具栏

让我们从创建包含文件处理操作的文件菜单及其工具栏开始。

文件:main.py

说明

在上述代码片段中,我们使用 addMenu() 函数创建了“文件”菜单,并使用 QToolBar() 方法创建了一个工具栏。然后我们使用 setIconSize() 函数将要显示在工具栏中的图标的主尺寸设置为顶部。然后我们使用将在本教程后面定义的自定义 make_action() 函数创建了不同的动作,如打开、保存、另存为和打印。我们还使用了 setShortcut() 方法为这些动作设置了快捷键。最后,我们使用了 addAction() 方法将所有创建的动作添加到“文件”菜单和工具栏。

编辑菜单及其工具栏

让我们从创建包含文本编辑操作的编辑菜单及其工具栏开始。

文件:main.py

说明

在上述代码片段中,我们使用 addMenu() 函数创建了“编辑”菜单,并使用 QToolBar() 类创建了一个工具栏。然后我们使用了 setIconSize() 函数,并设置了要显示在工具栏中的图标的主尺寸,并将此工具栏设置在顶部。然后我们使用了自定义的 make_action() 函数创建了不同的动作,例如撤消、重做、清除、剪切、复制、粘贴、全选和文本换行。我们还使用了 setShortcut() 方法为这些动作设置了快捷方式。最后,我们使用了 addAction() 方法将所有创建的动作添加到“编辑”菜单和工具栏中。最后,我们调用了将在本教程后面定义的自定义 updateTitle() 函数。

定义必要的函数并设置事件触发器

我们现在将定义所有必要的函数,以实现不同的操作,例如打开文件、将文件保存到目录、打印文件、切换文本换行命令、清除文件内容、打开显示消息的对话框、更新窗口标题以及为菜单和工具栏创建动作。

现在让我们详细了解这些函数的实现。

切换文本换行操作的函数

第一个函数将允许我们切换文本换行操作。我们将使用 setLineWrapMode() 方法。

让我们考虑以下说明相同内容的代码片段。

文件:main.py

说明

在上面的代码片段中,我们定义了函数 toggleWrapText()。在这个函数中,我们使用了 setLineWrapMode() 方法并切换了编辑器的当前状态。

清除文件内容的函数

我们将定义的第二个函数将允许我们重置或清除文件的内容。我们将使用 setPlainText() 方法将所有文本设置为空字符串。

让我们考虑以下说明相同内容的代码片段。

文件:main.py

说明

在上面的代码片段中,我们定义了函数 resetContent()。在这个函数中,我们使用了 setPlainText() 方法并传入一个空字符串来清除文件的全部内容。

打开文件的函数

我们现在将定义一个打开文件的函数。首先,我们将从目录中选择需要打开的文件。然后我们将检查目标是否不为空并尝试读取文件的内容。

让我们考虑以下说明相同内容的代码片段。

文件:main.py

说明

在上述代码片段中,我们定义了函数 fileOpen()。在这个函数中,我们使用了 QFileDialog() 类的 getOpenFileName() 方法来检索文件的路径。然后我们检查所选路径是否不是空字符串,并使用了 try-except 方法来打开和读取文件。我们还通过调用 updateTitle() 函数更新了窗口标题。

保存文件的函数

我们现在将定义一个保存文件的函数。首先,我们将检查用户是否正在处理现有文件。如果用户正在处理新文件,我们将调用 fileSaveAs() 函数来保存它。但是,如果用户正在处理一些已经存在的文件,该文件将使用 write() 方法以其以前的名称保存。

让我们考虑以下说明相同内容的代码片段。

文件:main.py

说明

在上述代码片段中,我们定义了函数 fileSave()。在此函数中,我们检查文件路径是否未指定,并调用 fileSaveAs() 函数。如果提供了文件路径,我们使用 try-except 方法,通过 write() 方法将文件以其原有名称保存。

以其他名称保存文件的函数

我们现在将定义另一个函数,用于将文件保存为新名称。首先,我们将从目录中选择要保存文件的路径。然后我们将使用 write() 方法将文件保存到该路径。

让我们考虑以下说明相同内容的代码片段。

文件:main.py

说明

在上述代码片段中,我们定义了函数 fileSaveAs()。在该函数中,我们使用 QFileDialog() 类的 getSaveFileName() 方法从目录中选择了文件保存路径。然后我们检查所选路径是否为空字符串。接着,我们使用 open() 方法打开文件,并使用 write() 方法将文本编辑器的内容写入该文件。最后,我们通过调用 updateTitle() 函数更新了标题。

打印文件的函数

我们现在将定义一个打印文件的函数。为了实现这个功能,我们将创建一个 QPrintDialog() 类的对象。

让我们考虑以下说明相同内容的代码片段。

文件:main.py

说明

在上面的代码片段中,我们定义了函数 printFile()。在这个函数中,我们实例化了 QPrintDialog() 类。然后我们使用 if 条件语句,通过调用 printer() 方法来执行打印命令。

打开对话框显示消息的函数

我们现在将定义一个函数,用于显示一个消息框,其中显示特定消息。此函数将使用 QMessageBox() 类的对象来创建对话框。

让我们考虑以下说明相同内容的代码片段。

文件:main.py

说明

在上述代码片段中,我们定义了函数 dialogMessage()。在该函数中,我们实例化了 QMessageBox() 类。然后我们使用 setText() 方法设置对话框的消息。接着,我们使用 setIcon() 方法设置了一个显示“严重”标记的图标。最后,我们使用 show() 方法显示了最终的对话框。

更新窗口标题的函数

我们现在将定义一个函数,它会根据文件名在每次文件处理操作时频繁更新窗口的标题。

让我们考虑以下演示相同内容的代码片段。

文件:main.py

说明

在上面的代码片段中,我们定义了函数 updateTitle()。在此函数中,我们使用了 setWindowTitle() 方法来设置窗口标题的格式。我们定义了一个变量字段,其中将显示文件名作为标题,并将其初始值设置为“Untitled”。

创建菜单和工具栏动作的函数

我们现在将定义最后一个函数,它将允许我们创建不同的动作来处理文件和文本编辑器。

让我们考虑以下演示相同内容的代码片段。

文件:main.py

说明

在上述代码片段中,我们定义了函数 make_action(),它接受多个参数,例如父类的对象、动作图标所在的路径、动作名称、在状态栏中显示的消息以及要调用的函数。在该函数内部,我们实例化了 QAction() 类来创建动作。然后我们使用了 setStatusTip() 方法来在状态栏中显示指定给每个动作的消息。接着我们使用了 triggered.connect() 方法来调用与不同动作关联的函数。最后,我们返回了 QAction() 类的对象。

至此,项目代码已完成。我们可以保存文件并在命令 shell 或终端中运行以下命令以查看输出。

语法

在查看输出之前,让我们先看一下 Python 中“使用 PyQt5 的记事本”项目的完整代码。

完整的项目代码

以下是 Python 编程语言中“使用 PyQt5 的记事本”项目的代码片段。

文件:main.py

输出

Building a Notepad using PyQt5 and Python