使用 PyQt5 在 Python 中制作图像查看器应用程序

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

图像查看器是一种软件应用程序,允许用户浏览和查看图像文件。市场上有各种不同用途的图像查看应用程序。例如,大多数图像查看软件,如Windows 照片查看器,仅设计用于查看。然而,其他图像查看器应用程序,如MS Paint、Adobe Photoshop、PhotoDirector 365等,除了简单的查看外,还提供图像编辑功能。这些从基础到高级的功能包括放大、缩小、裁剪或在图像上绘画。

在下面的教程中,我们将借助 Python 编程语言中的 PyQt5 库来构建一个图像查看器应用程序

但在我们开始之前,让我们简要了解一下PyQt是什么。

什么是 PyQt?

PyQt 是开源小部件工具包 Qt 的 Python 绑定,它也作为一个多平台应用程序开发框架。Qt 是一个著名的 C++ 框架,用于为所有主流桌面、移动和嵌入式平台(支持 Windows、Linux、MacOS、iOS、Android、Raspberry Pi 等)编写图形用户界面 (GUI) 应用程序。

PyQt 是由位于英国的公司 Riverbank Computing 开发和维护的开源软件,而 Qt 则是由一家名为 Qt Company 的芬兰公司开发的。

PyQt 的一些特性

PyQt 包含超过六百个类,涵盖了广泛的功能,例如

  1. 图形用户界面
  2. Web 工具包
  3. SQL 数据库
  4. 网络
  5. XML 处理

我们可以结合这些功能来创建高级 UI 和独立应用程序。全球许多大公司都在使用 Qt。例如 LG、松下、哈曼、AMD、梅赛德斯等等。

PyQt 的版本

PyQt 有两个版本可供用户使用 - PyQt4PyQt5PyQt4 提供了绑定 Qt 框架“4.x”和“5.x”版本的粘合代码,而 PyQt5 仅提供对“5.x”版本的绑定。因此,PyQt5 不向后兼容旧版本中已弃用的模块。

在下面的教程中,我们将使用 PyQt5 来构建项目。

如何安装 PyQt5?

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

语法

验证安装

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

文件:verify.py

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

语法

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

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

项目先决条件

为了开始在 Python 中使用 PyQt5 构建图像查看器,需要对该语言的语法和函数有基本的了解。由于 Python 是一种高级解释型面向对象编程语言,我们也将使用类和对象的概念。此外,以下是我们在整个项目中将使用的模块:

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

在 Python 中构建图像查看器应用

我们将首先创建一个新文件夹,命名为“Image Viewer”。在这个文件夹内,我们将创建另一个文件夹,命名为“icons”,其中将包含我们项目所需的所有图标,以及一个名为“main.py”的 Python 程序文件,我们将在其中编写项目的源代码。

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

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

以下是我们将采取的步骤来完成这个项目。

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

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

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

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

第 5 步: 最后,我们将定义必要的方法并设置事件触发器。

让我们详细了解这些功能。

为项目导入必要的模块和类

我们将首先导入 sys 模块以及来自 PyQt5 模块不同模块的各种类。

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

文件:main.py

说明

在上面的代码片段中,我们导入了 sys 模块。然后,我们从 PyQt5 模块的 QtCore、QtWidgets、QtGuiQtPrintSupport 模块中导入了所有必需的类。

创建应用程序的主窗口

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

文件:main.py

说明

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

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

向应用程序添加标签和滚动区域

我们现在将创建一个 QPrinter 类的对象,它将允许我们打印图像。我们将定义一个初始缩放因子。然后我们将使用 QLabel 类添加一个标签来显示图像。我们还将使用 QScrollArea 类创建一个滚动区域,以包含应用程序的主布局。

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

文件:main.py

说明

在上面的代码片段中,我们创建了一个 QPrinter 类的对象,并定义了一个变量来存储初始缩放因子。然后我们创建了一个 QLabel 类的对象来显示标签。我们使用了 QPalette 类的 Base 常量作为 setBackgroundRole() 方法的参数,以设置标签的背景颜色来显示图像。然后,我们借助传递给 setSizePolicy() 方法的 QSizePolicy 类的 Ignored 常量来设置标签的大小策略。接着,我们创建了一个 QScrollArea 类的对象来显示滚动条。我们使用了 QPalette 类的 Dark 常量作为 setBackgroundRole() 方法的参数,为滚动条设置了较暗的背景色。然后,我们通过将图像标签传递给 QScrollArea 对象的 setWidget() 方法来指定要滚动的区域。我们还借助 setVisible() 方法将滚动区域的可见性设置为 False。最后,我们使用 setCentralWidget() 方法将滚动区域设置为应用程序的中心部件。

创建菜单和工具栏

我们现在将创建菜单和工具栏。这些菜单和工具栏将帮助我们对文本执行不同的操作。为了保持简单,我们将创建一个包含文件处理操作的“文件”菜单和一个包含管理图像显示操作的“视图”菜单,以及它们各自的工具栏。我们将在“文件”菜单中包含打开、打印和退出等操作,而在“视图”菜单中包含放大、缩小、正常大小和适应窗口等操作。

文件菜单及其工具栏

让我们首先创建文件菜单及其工具栏,其中包含执行文件处理的操作。

文件:main.py

说明

在上面的代码片段中,我们使用 addMenu() 方法创建了“文件”菜单,并使用 QToolBar() 方法创建了一个工具栏。然后我们使用 setIconSize() 方法设置了工具栏中要显示的图标的主要尺寸,并将此工具栏设置在顶部。然后我们使用用户定义的 make_action() 方法创建了不同的操作,如打开、打印和退出,我们将在本教程后面定义该方法。我们还使用 setShortcut() 方法为这些操作设置了快捷方式。我们还使用 addSeparator() 方法在操作之间添加了分隔符。此外,我们向 setEnabled() 方法传递了 False,以初始禁用打印操作。最后,我们使用 addAction() 方法将所有创建的操作添加到“文件”菜单和工具栏中。

视图菜单及其工具栏

我们现在将创建视图菜单及其工具栏,其中包含管理图像显示的操作。

文件:main.py

说明

在上面的代码片段中,我们使用 addMenu() 方法创建了“视图”菜单,并使用 QToolBar() 方法创建了一个工具栏。然后我们使用 setIconSize() 方法设置了工具栏中要显示的图标的主要尺寸,并将此工具栏设置在顶部。然后我们使用用户定义的 make_action() 方法创建了不同的操作,如放大、缩小、正常大小和适应窗口,我们将在本教程后面定义该方法。我们还使用 setShortcut() 方法为这些操作设置了快捷方式。我们还使用 addSeparator() 方法在操作之间添加了分隔符。此外,我们向 setEnabled() 方法传递了 False,以初始禁用所有操作。最后,我们使用 addAction() 方法将所有创建的操作添加到“视图”菜单和工具栏中。

定义类的所需方法

我们现在将定义所有必要的方法,以执行应用程序中的每个操作。这些方法包括打开图像文件、打印图像、放大、缩小图像、设置正常大小以及将图像设置为窗口大小

现在让我们详细了解每种方法的实现。

打开图像文件的方法

我们现在将定义从目录中打开图像文件的方法。在此方法中,我们将使用 QFileDialog 类从目录中选择图像文件。然后我们将在应用程序窗口中显示所选的图像文件。

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

文件:main.py

说明

在上面的代码片段中,我们将该方法定义为 openImage()。在此方法中,我们创建了一个 QFileDialog.Options 类的对象。然后我们调用 getOpenFileName() 方法来从目录中浏览图像。然后我们检查文件名是否为空字符串,并通过将文件名作为其参数来创建 QImage 类的对象。我们还检查了图像文件是否为空,并返回显示信息的消息框。然后我们使用 setPixmap() 方法创建了一个可以作为绘制设备的屏幕外图像表示。我们还将 scale_factor 设置为 1.0,并启用了滚动区域的可见性。我们还启用了最初禁用的不同操作,并调用了用户定义的 fit_to_window()update_actions() 方法。最后,我们调用了 adjustSize() 方法,以便在“适应窗口”操作未被选中时调整图像的大小。

打印图像文件的方法

我们现在将定义打印图像的方法。在此方法中,我们将使用 QPainterQPrintDialog 类根据宽高比配置图像大小并进行打印。

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

文件:main.py

说明

在上面的代码片段中,我们将该方法定义为 printImage()。在此方法中,我们创建了一个 QPrintDialog 类的对象。然后我们检查是否执行了“打印”操作,并创建了一个 QPainter 的对象,将 QPrintDialog 的对象作为其参数传递。然后我们创建并使用了 viewport() 方法来显示图像。然后我们定义了图像的大小,并根据宽高比缩放了图像。然后我们通过调用 setViewport() 方法设置了图像的视口。最后,我们还调用了 setWindow()drawPixmap() 方法。

放大图像的方法

我们现在将定义放大图像的方法。在此方法中,我们将调用用户定义的 scale_image() 方法,根据传递给它的参数值来缩放图像大小。

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

文件:main.py

说明

在上面的代码片段中,我们将该方法定义为 zoom_in()。在此方法中,我们调用了用户定义的 scale_image() 方法,并传递了 1.25 的缩放因子作为其参数。

缩小图像的方法

我们现在将定义缩小图像的方法。在此方法中,我们将调用用户定义的 scale_image() 方法,根据传递给它的参数值来缩放图像大小。

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

文件:main.py

说明

在上面的代码片段中,我们将该方法定义为 zoom_out()。在此方法中,我们调用了用户定义的 scale_image() 方法,并传递了一个 0.8 的缩放因子作为其参数。

将图像尺寸设置为正常的方法

我们现在将定义将图像尺寸设置为正常的方法。在此方法中,我们将调用 adjustSize() 方法来调整图像的大小,并将缩放因子设置为 1.0

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

文件:main.py

说明

在上面的代码片段中,我们将该方法定义为 normal_size()。在此方法中,我们调用了 adjustSize() 方法来调整图像的大小。最后,我们将缩放因子设置为 1.0

将图像尺寸设置为适应窗口的方法

我们现在将定义将图像尺寸设置为适应窗口的方法。为此,我们将存储从“适应窗口”操作中检索到的布尔值,并配置滚动区域以相应地调整大小。如果检索到的值为 False,我们将调用用户定义的 normal_size() 方法。

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

文件:main.py

说明

在上面的代码片段中,我们将该方法定义为 fit_to_window()。在此方法中,我们定义了一个变量,用于存储从“适应窗口”操作中检索到的布尔值,并使用 setWidgetResizable() 方法相应地调整滚动区域的大小。如果检索到的值为 False,我们还调用了用户定义的 normal_size() 方法。最后,我们调用了用户定义的 update_actions() 方法。

更新操作的方法

我们现在将定义启用“放大”、“缩小”和“正常大小”等操作的方法。

文件:main.py

说明

在上面的代码片段中,我们将该方法定义为 update_actions()。在此方法中,我们使用 setEnabled() 方法来启用“放大”、“缩小”和“正常大小”等操作。

缩放图像大小的方法

我们现在将定义缩放图像大小的方法。此方法将接受一个参数作为缩放因子。在此方法中,我们将在用户每次点击“放大”、“缩小”和“正常大小”操作时乘以缩放因子,并相应地调整图像大小。我们还将根据图像大小调整滚动条的大小。

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

文件:main.py

说明

在上面的代码片段中,我们将该方法定义为 scale_image(),它接受一个参数 sf。在此方法中,我们通过将其与传递给该方法的值相乘来初始化缩放因子。我们使用 resize() 方法根据缩放因子调整图像大小。我们还调用了用户定义的 adjust_scroll_bar() 方法,以根据缩放因子调整水平和垂直滚动条的长度。最后,我们相应地切换了“放大”和“缩小”的状态。

调整滚动条长度的方法

我们现在将定义根据缩放因子调整滚动条长度的方法。此方法将接受多个参数,例如需要调整的滚动条以及根据其调整滚动条的缩放因子。在此函数内部,我们将定义调整滚动条长度的公式。

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

文件:main.py

说明

在上面的代码片段中,我们将该方法定义为 adjust_scroll_bar(),它接受多个参数,如 scroll_barscaleFactor。在此方法中,我们使用了 setValue() 方法,传递了根据缩放因子调整滚动条长度的公式。

创建菜单和工具栏操作的方法

我们现在将定义最后一个方法,该方法允许我们创建不同的操作来处理文件和文本编辑器。

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

文件:main.py

说明

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

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

语法

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

完整的项目代码

以下是使用 Python 编程语言实现的“使用 PyQt5 的图像查看器”项目的代码片段。

文件:main.py

输出

Image Viewer Application using PyQt5 in Python