使用 PyQt、SQLite 和 Python 创建联系人列表

2025年3月17日 | 阅读16分钟

本教程将教你如何使用Python、PyQt和SQLite创建一个通讯录应用程序。这个项目将是学习不同编码技能的有效方式,因为它要求你运用各种技术并鼓励你在开发过程中研究相关主题。

完成此项目后,你将拥有一个可用的通讯录应用程序,可以存储和管理你的联系人信息。你可以搜索、查看、添加、修改和删除联系人。本教程将指导你完成应用程序的开发过程,并让你更好地理解如何使用Python和PyQt创建GUI、连接到SQLite数据库以及使用Model-View架构管理数据。应用程序的源代码和每个教程步骤都可通过提供的链接获取。

项目概述

要构建一个通讯录应用程序,你必须将代码组织成模块和包,以使你的项目结构清晰连贯。在本教程中,你将使用以下目录和文件结构:

  • rpcontacts_project/ - 项目的根目录
    • rpcontacts/ - 包含应用程序主要代码的包
      • __init__.py - 一个空文件,指示Python将此目录视为Python包。
      • views.py - 包含图形用户界面(GUI)代码的模块
      • database.py - 包含连接到SQLite数据库代码的模块
      • main.py - 包含运行应用程序代码的模块
      • model.py - 包含使用Model-View架构管理联系人数据的代码的模块
    • requirements.txt - 包含项目依赖项的文件
    • README.md - 包含项目文档的文件
    • rpcontacts.py - 运行应用程序的文件

将提供使用这些文件中的每一个的分步说明。

步骤1:使用PyQt创建通讯录的骨架应用程序

在此初始阶段,你将设计一个简单而有用的PyQt GUI应用程序,它将作为通讯录的框架。你还将创建最基本的项目结构,其中包含项目的核心包和用于启动程序的脚本。

通讯录项目的组织

创建一个名为rpcontacts_project/的新目录以开始编写应用程序代码。

这将是项目的根目录。现在在rpcontacts_project/下,创建一个名为rpcontacts/的新子文件夹。此子文件夹将容纳程序的主包。在根目录中打开你的代码编辑器或集成开发环境。

Python需要一个__init__.py模块来初始化包,以便将目录转换为包。在rpcontacts/目录中创建此文件,然后向其中添加以下代码:

此文件告知Python rpcontacts包的存在。当你导入包或其模块之一时,文件中的代码将运行。

可以在不写入__init__.py文件代码的情况下初始化包。使用空的__init__.py文件就足够了。为了在此实例中保留程序的版本号,你创建了一个名为的模块级常量

创建应用程序的主窗口

现在应该为你的通讯录创建主窗格。为此,请向你的rpcontacts包添加一个名为views.py的模块。

然后用以下代码更新模块并保存

你首先需要从PyQt5.QtWidgets导入必要的类。接下来,创建一个Window。此派生自QMainWindow的类提供了用于创建应用程序主窗口的代码。Window被调整为550 x 250像素,Window的标题更改为“RP Contacts”,并且使用QWidget定义和配置中心部件。然后使用水平盒布局定义中心部件的布局。

运行应用程序和编码

通讯录的主窗口已经创建。因此是时候使用QApplication构建一个可用的PyQt应用程序的代码了。在你的rpcontacts包中创建一个名为main.py的新模块,并向其中添加以下代码以实现此目的

当你将sys导入此模块时,你将可以访问exit()函数,该函数使你能够在用户退出主窗口时优雅地终止程序。接下来,分别从PyQt5导入QtWidgets、QApplication和Window。最后一步是将main()定义为应用程序的主函数。

你在main()中创建QApplication和Window。之后,你使用exec在Windows上启动应用程序的主循环或事件循环,然后调用show()。

立即在根目录rpcontacts_project中创建一个名为rpcontacts.py的文件。此文件提供了应用程序的入口点脚本。添加以下代码后保存文件

你的main.py模块的main()在此文件中导入。然后,如果用户像Python脚本一样运行此模块,则将调用main()的传统条件语句付诸实践。运行命令python rpcontacts.py以在你的Python环境中启动程序。

以下窗口将出现在你的屏幕上

Create a Contacts List Using PyQt, SQLite, and Python

步骤2:使用Python创建通讯录的GUI

在此步骤中,我们需要创建通讯录的GUI,其中包含添加、删除和清除所有按钮

返回views.py模块并修改Window代码以生成上述GUI

此代码中对Window的第一个修改是在__init__()的末尾调用.setupUI()。

当你启动应用程序时,此调用会为主窗口创建GUI。

内部代码在此处显示。setupUI()的作用

  • 创建并使用QTableView实例来显示联系人列表。
  • 将.selectionBehavior属性的值设置为QAbstractItemView.SelectRows。联系人列表中的每个联系人的数据都包含在表格视图的行中。这确保当用户单击任何表格视图单元格时,将选择整个行。
  • 向GUI添加“添加”、“删除”和“全部清除”按钮。这些按钮目前没有任何功能。
  • 为所有GUI小部件建立一致的布局。

运行代码后,将出现此屏幕

Create a Contacts List Using PyQt, SQLite, and Python

步骤3:构建通讯录的数据库

在本节中,你将创建代码来指定应用程序如何连接到联系人数据库。要完成此步骤,请使用PyQt的SQL支持将应用程序连接到数据库,并使用SQLite和你的联系人信息来管理数据库。

首先,返回rpcontacts/目录中的main.py并更新代码以创建数据库连接。

在main()函数的“from .database import createConnection”行中,可以看到尝试使用createConnection建立数据库连接。如果应用程序因某种原因无法建立连接,则对sys.exit(1)的调用将关闭应用程序而不会创建图形元素,并将指示错误。

由于应用程序依赖于数据库才能正常运行,因此你必须以这种方式处理连接。如果没有可用的连接,你的应用程序将无法运行。

如果出现问题,你可以处理并关闭应用程序,这得益于此做法。此外,你将能够向用户提供有关应用程序连接到数据库时出现的错误的相关详细信息。

使用PyQt和SQLite连接到数据库

创建通讯录应用程序的第一步是将其连接到与之配套的数据库。为此,你必须编程函数createConnection(),该函数打开并创建与数据库的连接。如果连接成功,该函数将返回True。如果不是,它将详细说明连接出了什么问题。返回rpcontacts/目录并添加新的database.py模块。然后将以下代码合并到该模块中

在这里,如果你首先导入一些PyQt类会有帮助。接下来,定义createConnection()。此函数的唯一参数DatabaseName指定存储在文件系统中的SQLite数据库文件的名称或位置。你已经编码了CreateConnection()。现在数据库的contacts表已准备就绪,可以编写创建它们的代码。现在,一旦创建和打开数据库连接的函数到位,你就可以编写一个辅助函数来创建contacts表。此表将用于跟踪你的联系人信息。

你在_createContactsTable()函数中创建QSqlQuery实例。之后,你使用基于字符串的SQL CREATE TABLE语句调用查询对象的exec()方法。

你的数据库的联系人表将包含有关你的联系人的相关数据。

在database.py的编码完成之前,只需在最后一个return语句之前从createConnection()内部调用_createContactsTable()。这确保应用程序在数据库操作之前创建contacts表。创建contacts表后,你可以测试数据库并添加一些示例数据以进行额外测试。

通讯录的数据库测试

你已经完成了编写代码以管理通讯录的数据库连接。你将在本节中运行一些测试,以验证此代码和数据库的功能。稍后在本教程中,你将向数据库添加一些测试数据以进行额外测试。

现在打开终端或命令提示符,然后导航到根目录rpcontacts_project/。在那里,启动一个交互式Python会话并输入以下代码

此代码使用"rpcontacts.database"模块中的"createConnection"函数连接到名为"contacts.sqlite"的SQLite数据库。然后,通过调用QSqlDatabase对象的"tables()"方法,它确认数据库中存在"contacts"表。

为了将数据插入"contacts"表,它创建一个QSqlQuery对象并准备一个SQL语句。该语句包含表中"name"、"job"和"email"列值的占位符。

然后,代码定义了一个示例数据列表,其中每个元素都是一个元组,其中包含"contacts"表中单行的值。然后,它遍历此列表,将值绑定到准备好的查询中的占位符,并执行查询以将数据插入表中。

最后,代码创建另一个QSqlQuery对象,执行SELECT语句以从"contacts"表中检索数据,并打印表中每行的"name"、"job"和"email"列的值。

Create a Contacts List Using PyQt, SQLite, and Python

步骤4:查看和修改当前联系人

在应用程序的主窗口中,你可以使用QTableView显示联系人信息。

开发用于管理联系人数据的模型

对于与SQL数据库交互,PyQt提供了广泛的类。你将为你的通讯录应用程序使用QSqlTableModel,它为单个数据库表提供了可编辑的数据模型。鉴于你的数据库在一个表中包含联系人,它非常适合此任务。

返回你的代码编辑器,并将一个名为model.py的新模块添加到rpcontacts/目录。添加以下代码后保存文件

你的数据模型现在可以使用了。你必须在此代码中执行一些必要的导入,然后才能创建ContactsModel。类初始化程序指定一个模型实例属性,该属性将包含数据模型。你添加以下静态方法,用于配置模型对象。

如果你现在将表格视图小部件链接到模型以向用户显示联系人信息,那将有所帮助。

链接视图和模型

你必须链接表格视图和数据模型才能在通讯录的主窗口中显示联系人信息。要建立此连接,你必须在表格视图对象上调用setModel()并将模型作为参数传递

你在此代码的开头从model.py导入ContactsModel。此类提供了用于管理联系人数据库中信息的模型。

你在Window初始化程序中创建一个ContactsModel实例。然后,为了将模型与表格视图链接,你在.setupUI()中对表格对象调用.setModel()。如果你在此更新后启动应用程序,将出现你在步骤4开始时看到的窗口。

Create a Contacts List Using PyQt, SQLite, and Python

你可以双击姓名、职位和电子邮件来更改值。

Create a Contacts List Using PyQt, SQLite, and Python

步骤5:更新联系人

你现在可以使用通讯录应用程序提供的功能来加载、显示和更新联系人数据。你可以编辑和更新联系人详细信息,但不能从列表中添加或删除联系人。

添加联系人对话框的创建

对话框是允许你与用户进行对话的小窗口。在本节中,你将为通讯录编写“添加联系人”对话框的代码,以便你的用户可以将新联系人添加到现有列表中。

如果你子类化QDialog以编程“添加联系人”对话框,那将有所帮助。此类提供了为你的GUI程序创建对话框的模板。

此脚本提供使用PyQt5库管理联系人表的视图。主窗口类Window创建一个QTableView小部件来显示联系人数据,并包含添加新联系人、删除联系人和清除整个表的按钮。当单击“添加”按钮时,AddDialog类会创建一个对话框窗口,用户可以在其中输入新联系人的姓名、职位和电子邮件。ContactsModel使用新联系人将其添加到contacts表中。contact()方法添加在添加新联系人之前,AddDialog类还具有验证功能,以确保用户为每个字段提交一个值。添加对话框的模型中的数据处理你将在数据模型中包含一个名为ContactsModel的方法。

添加对话框模型中的数据处理

在本节中,你将向数据模型ContactsModel添加一个名为. Add contact ()的方法。在你的代码编辑器中转到model.py中ContactsModel的定义,并添加以下代码

此脚本是RP Contacts应用程序的“模型”模块,它提供了联系人表的数据模型。ContactsModel类管理基础SQLite联系人数据库,并包含添加、删除和检索联系人的方法。addContact方法用于向数据库添加新联系人,它接受一个参数“data”,该参数是一个列表,包含要添加联系人的姓名、职位和电子邮件。

该方法首先查找模型中的行数,然后在该位置插入新行。对于数据列表中的每个元素,该方法将新行中的相应单元格设置为该元素的值,然后将更改提交到数据库。最后,它在从数据库中选择数据后更新模型。

Create a Contacts List Using PyQt, SQLite, and Python

步骤6:删除当前联系人

通讯录的最终功能是删除通讯录中的联系人。

要删除通讯录中的特定联系人,我们需要更改视图和模型文件

此方法由三行代码组成。第一行消除了所选行。更改在第二行提交到数据库。第三行然后将数据再次加载到模型中。

之后返回views.py模块,并将以下代码添加到Window中的“删除”按钮

此脚本是RP Contacts应用程序的“视图”模块,它提供了联系人表的用户界面。Window类是QMainWindow的子类,负责创建和管理应用程序的主窗口。

在setupUI方法中,创建了一个名为“删除”的按钮,并将deleteContact方法连接到按钮的clicked信号。

deleteContact方法负责从数据库中删除联系人。当调用此函数时,最初确定表格视图中当前选定行的索引。如果没有选择行,该方法将退出。然后它显示一个警告消息框,要求用户确认删除联系人,如果用户确认,该方法调用ContactsModel类的deleteContact方法,并将所选行的索引传递给它,该索引对应于要从数据库中删除的联系人。

Create a Contacts List Using PyQt, SQLite, and Python

数据库清除

在此会话中,我们将为“全部清除”按钮添加功能

为此,我们需要更改文件

此方法由三行代码组成。第一行消除了所选行。

更改在第二行提交到数据库。第三行然后将数据再次加载到模型中。之后返回views.py模块,并将以下代码添加到Window中的“删除”按钮

该方法将提示用户是否要清除所有联系人。如果他们点击“是”,那么所有联系人都将被擦除。

Create a Contacts List Using PyQt, SQLite, and Python

一切完成!你的通讯录应用程序已完成,最后一行代码。你的用户可以使用应用程序提供的功能来显示、添加、更新和删除数据库中的联系人。