亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Industrial programming >> Python

PyQt5 示例教程:在 Python 中使用 PyQt 设计 GUI

什么是 PyQt?

PyQt 是开源widget-toolkit Qt的python绑定,它也可以作为一个跨平台的应用程序开发框架。 Qt 是一个流行的 C++ 框架,用于为所有主要的桌面、移动和嵌入式平台(支持 Linux、Windows、MacOS、Android、iOS、Raspberry Pi 等)编写 GUI 应用程序。

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

在本 PyQt5 教程中,您将学习:

PyQT 的特点

以下是 PyQt 的重要特性:

学习 PyQt,它由 600 多个类组成,涵盖了一系列功能,例如

这些功能可以结合起来创建高级 UI 以及独立的应用程序。各行各业的许多大公司都在使用 Qt。一些例子是 LG、梅赛德斯、AMD、松下、哈曼等。

PyQt 版本

PyQt 有两个版本,PyQt4 和 PyQt5。 PyQt4 提供了用于绑定 Qt 框架的 4.x 和 5.x 版本的胶水代码,而 PyQt5 只为 5.x 版本提供了绑定。因此,PyQt5 不向后兼容旧版本的已弃用模块。在本 Qt GUI 教程中,将使用 PyQt5 进行示例演示。除了这两个版本,

Riverbank Computing 还提供 PyQt3D——Qt3D 框架的 python 绑定。 Qt3D 是一个应用程序框架,用于创建具有 2D/3D 渲染的实时仿真系统。

如何安装 PyQt5

在这个 PyQt5 教程中,我们将看到安装 PyQt 的两种方式:

Qt(读作cute)是一个复杂的系统,PyQt 代码库包含编译后的C++ 和Python 代码。因此,与其他 python 库相比,从源代码构建和安装它是一个复杂的过程。但是,您可以使用轮子轻松安装 PyQt5。

用轮子安装

Wheels 是新的标准 Python 打包和分发格式。简单来说,轮子是一个具有特殊名称和 .whl 的 ZIP 存档 文件扩展名。 Wheels 可以使用 pip(Python 的包管理器)安装,它默认包含在最新版本的 Python 中。

所以,如果你安装了 Python 3.4 或更高版本,你就已经有了 pip。但是,如果您使用的是旧版本的 Python,则必须先下载并安装 pip,然后再继续。您可以在此链接中搜索相关说明:https://pypi.org/project/pip/。

要安装 PyQt5,

步骤 1) 打开命令提示符。
在您的 Windows 机器中打开命令提示符或 PowerShell。

步骤 2) 输入以下内容。

 pip install PyQt5

步骤 3) 安装成功。
本 PyQt5 教程中的这一步将下载 PyQt5 whl 包(约 50 MB)并将其安装到您的系统上。

或者,您也可以下载您计算机上安装的 python 版本的 Windows 二进制文件。

完成后,继续本 PyQt5 教程的下一部分编写您的第一个 GUI 应用程序。

基本 PyQt 概念和程序

现在您已经成功在您的计算机中安装了 PyQt5,您可以开始编写 Python GUI 设计应用程序了。

让我们从这个 PyQt5 教程中的一个简单应用开始,它将在您的屏幕上显示一个空窗口。

启动你的 python IDLE 并输入以下内容:

程序 1

import sys
from PyQt5.QtWidgets import QApplication, QWidget
if __name__ == "__main__":
    app = QApplication(sys.argv)
    w = QWidget()
    w.resize(300,300)
    w.setWindowTitle("Guru99")
    w.show()
    sys.exit(app.exec_())

将其保存为 app.py(名称无关紧要),然后按 F5 运行程序。或者,只需双击您保存的文件即可启动应用程序。如果一切都做对了,将会打开一个标题为 Guru99 的新窗口,如下所示。

伟大的!它正在工作。内容不多,但掌握基本知识就足够了。现在在这个 PyQt 教程中,让我们详细了解一下程序中每一行的作用。

from PyQt5.QtWidgets import QApplication, QWidget

该语句将创建 GUI 所需的所有模块导入到当前命名空间中。 QtWidgets 模块包含您将在本 Python Qt 教程中使用的所有主要小部件。

app = QApplication(sys.argv)

在这里,您正在创建 QApplication 类的对象。这一步对于 PyQt5 来说是必须的;每个 UI 应用程序都必须创建一个 QApplication 实例,作为应用程序的一种入口点。不创建会报错。

sys.argv 是命令行参数列表,您可以在通过 shell 启动应用程序或自动执行界面时传递给应用程序。

在这个 PyQt5 示例中,您没有将任何参数传递给 QApplications。因此,你也可以用下面的代码替换它,甚至不必导入 sys 模块。

app = QApplication([])
w = QWidget()

接下来,我们创建一个 QWidget 类的对象。 QWidget 是 Qt 中所有 UI 对象的基类,您在应用程序中看到的几乎所有东西都是一个小部件。这包括对话框、文本、按钮、栏等等。允许您设计复杂用户界面的功能是小部件可以嵌套,即,您可以在一个小部件中拥有一个小部件,该小部件位于另一个小部件内。您将在下一节中看到这一点。

w.resize(300,300)

QWidget 类的 resize 方法允许您设置任何小部件的尺寸。在这种情况下,您已将窗口大小调整为 300 x 300 像素。

在这里,您应该记住,小部件可以嵌套在一起,最外面的小部件(即没有父小部件)称为窗口。

w.setWindowTitle("Guru99")

setWindowTitle() 方法允许您传递一个字符串作为参数,它将窗口的标题设置为您传递的字符串。在 PyQt5 示例中,标题栏将显示 Guru99。

w.show()

show() 只是在监视器屏幕上显示小部件。

sys.exit(app.exec_())

app.exec_() 方法启动 Qt/C++ 事件循环。如您所知,PyQt 主要是用 C++ 编写的,并使用事件循环机制来实现并行执行。 app.exec_() 将控制权交给 Qt,Qt 只有在用户从 GUI 关闭应用程序时才会退出应用程序。这就是为什么 ctrl+c 不会像在其他 python 程序中那样退出应用程序。由于 Qt 可以控制应用程序,因此除非我们在应用程序中设置它们,否则不会处理 python 事件。另外,请注意 exec 方法的名称中有一个下划线;这是因为 exec() 已经是 python 中的关键字,下划线解决了命名冲突。

空窗之外

在上一节中,您看到了如何在 Qt 中制作一个基本的小部件。现在是时候制作一些用户可以真正与之交互的更复杂的界面了。再次启动你的 IDLE 并编写以下内容。

import sys
from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QPushButton, QMessageBox

def dialog():
    mbox = QMessageBox()

    mbox.setText("Your allegiance has been noted")
    mbox.setDetailedText("You are now a disciple and subject of the all-knowing Guru")
    mbox.setStandardButtons(QMessageBox.Ok | QMessageBox.Cancel)
            
    mbox.exec_()

if __name__ == "__main__":
    app = QApplication(sys.argv)
    w = QWidget()
    w.resize(300,300)
    w.setWindowTitle("Guru99")
    
    label = QLabel(w)
    label.setText("Behold the Guru, Guru99")
    label.move(100,130)
    label.show()

    btn = QPushButton(w)
    btn.setText('Beheld')
    btn.move(110,150)
    btn.show()
    btn.clicked.connect(dialog)

    
    w.show()
    sys.exit(app.exec_())

将文件另存为 appone.py 或任何您喜欢的文件,然后按 F5 运行程序。如果您没有犯任何错误,IDLE 将打开一个新窗口,其中包含一些文本和一个按钮,如下所示。

  1. 单击第一个窗口中的按钮后,将弹出一个新消息框,其中包含您编写的文本。
  2. 您现在可以单击“隐藏详细信息/显示详细信息”按钮来切换其他文本的可见性。

如您所见,由于我们没有在消息框中设置任何窗口标题,因此python自己提供了一个默认标题。

现在它可以工作了,让我们看看您添加到之前 PyQt5 示例中的额外代码。

from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QPushButton, QMessageBox

这会导入您在 PyQt5 示例中使用的更多小部件,即 QLabel、QPushButton 和 QMessageBox。

def dialog():
    mbox = QMessageBox()

    mbox.setText("Your allegiance has been noted")
    mbox.setDetailedText("You are now a disciple and subject of the all-knowing Guru")
    mbox.setStandardButtons(QMessageBox.Ok | QMessageBox.Cancel)
            
    mbox.exec_()

在这里,您定义了一个名为 dialog 的方法,该方法创建一个消息框小部件并为按钮和其他字段设置一些文本。

当在特定小部件(在本例中为 btn PushButton)中按下按钮时,从程序的主块调用对话框方法。在该按钮上触发的单击事件会导致该函数执行。这样的函数在 Qt 中称为 slot,您将了解更多关于 signals插槽 在接下来的段落中。

if __name__ == "__main__":
    app = QApplication(sys.argv)
    w = QWidget()
    w.resize(300,300)
    w.setWindowTitle("Guru99")

这是应用程序的主要部分,与前面的示例一样,您首先创建一个 QApplication 实例,然后创建一个简单的小部件,即 QWidget 的一个实例。

label = QLabel(w)
    btn = QPushButton(w)

您在此应用程序中添加了两个新的小部件:QLabel 和 QPushButton。 QLabel 用于在小部件内打印不可编辑的文本或占位符,而 QPushButton 用于创建可点击的按钮。

这里要注意的关键是,当您创建标签和 btn 对象时,您将窗口对象 (w) 传递给 QLabel 和 QPushButton 的构造函数。这就是 PyQt5 中嵌套的工作方式。要在另一个小部件中创建一个小部件,请将父小部件的引用传递给子小部件的构造函数。

label.move(100,130)
btn.move(110,150)

move() 用于设置小部件相对于其父小部件的位置。在第一种情况下,标签会从窗口左侧移动 100px,从顶部移动 130px。

同样,按钮将放置在距窗口左侧 110 像素和距窗口顶部 150 像素的位置。这个例子是实现布局的粗略方式,一般不会在生产中使用;此处仅用于学习目的。 Qt 支持不同的布局,您将在本 PyQt 教程的后续部分中详细了解这些布局。

btn.clicked.connect(dialog)

最后,这是 Qt 中信号和槽的示例。在基于 GUI 的应用程序中,功能是根据用户执行的操作执行的,例如将鼠标悬停在元素上或单击按钮。这些动作称为事件 .回想一下,app.exec_() 方法将控制权转移到 Qt event- 环形。这就是事件循环的作用:监听事件并执行响应操作。

每当事件发生时,例如用户单击按钮,相应的 Qt 小部件就会发出 信号 .这些信号可以连接到python函数(如本例中的对话框函数),以便在触发信号时执行该函数。这些函数称为 slots 用 Qt 术语。

随后,触发槽函数以响应来自事件的信号的基本语法如下

 widget.signal.connect(slot)

这意味着每当一个信号widget 触发 , 连接的 slot 函数将被执行。综上所述,Qt使用信号和槽来实现对象之间的通信,并促进组件的可重用性和交互性。

现在您已经知道如何嵌套小部件并使用信号和插槽实现交互,这里列出了您可以在 PyQt 应用程序中使用的有用小部件和其他类。

组件和小部件

PyQt 中有大量用于创建 GUI 应用程序的小部件。但是,在 PyQt5 中,已经将类重新洗牌到不同的模块和许可证中的修订版中。

因此,对 PyQt5 的结构有一个高层次的认识是至关重要的。在本节中,您将了解 PyQt5 内部是如何组织的,并了解 PyQt5 提供的不同模块、库和 API 类。

PyQt5 目录结构

这些是 Python 的 Qt 绑定使用的基本模块,特别是 PyQt5。

PyQt5 小部件

以下是 PyQt5 中最常用的小部件列表

布局和主题

在前面的 PyQt5 示例中,您只使用了 move() 和 resize() 方法来设置小部件在 GUI 中的位置。

然而,PyQt 具有强大的布局管理引擎,可用于为应用程序创建高级用户界面。在本节中,您将了解 Qt 中用于创建和管理布局的两个重要类。

  1. QBoxLayout
  2. QGridLayout

QBoxLayout

QBoxLayout 用于在水平或垂直行中对齐布局的子小部件。从 QBoxLayout 继承的两个感兴趣的类是:

例如,这就是与 QHBoxLayout 对齐的三个按钮的外观。

import sys
from PyQt5.QtWidgets import *

if __name__ == "__main__":

    app = QApplication([])
    w = QWidget()
    w.setWindowTitle("Musketeers")

    btn1 = QPushButton("Athos")
    btn2 = QPushButton("Porthos")
    btn3 = QPushButton("Aramis")

    hbox = QHBoxLayout(w)

    hbox.addWidget(btn1)
    hbox.addWidget(btn2)
    hbox.addWidget(btn3)

    w.show()

    sys.exit(app.exec_())

这就是它们在 QVBoxLayout 中的外观。

import sys
from PyQt5.QtWidgets import *

if __name__ == "__main__":

    app = QApplication([])
    w = QWidget()
    w.setWindowTitle("Musketeers")

    btn1 = QPushButton("Athos")
    btn2 = QPushButton("Porthos")
    btn3 = QPushButton("Aramis")

    vb = QVBoxLayout(w)

    vb.addWidget(btn1)
    vb.addWidget(btn2)
    vb.addWidget(btn3)

    w.show()

    sys.exit(app.exec_())

此时唯一需要解释的函数是 addWidget() 方法。它用于将小部件插入 HBox 或 VBox 布局。它还用于其他布局,其中它采用不同数量的参数,您将在下一节中看到。小部件将按照您插入它们的顺序出现在布局中。

QGridLayout

QGridLayout 用于创建小部件以网格形式(如矩阵或二维数组)布局的界面。要在网格布局中插入元素,您可以使用矩阵表示来定义网格中的行数和列数以及这些元素的位置。

例如,要创建一个 3*3 的网格(即三行三列的网格),您将编写以下代码:

Import sys
from PyQt5.QtWidgets import *

if __name__ == "__main__":
    app = QApplication([])

    w = QWidget()

    grid = QGridLayout(w)

    for i in range(3):
        for j in range(3):
            grid.addWidget(QPushButton("Button"),i,j)


    w.show()
    sys.exit(app.exec_())

这将是输出:

网格布局中的 addWidget() 方法采用以下参数:

为了更好地理解它,您可以手动插入每个小部件,如下所示

import sys
from PyQt5.QtWidgets import *

if __name__ == "__main__":
    app = QApplication([])

    w = QWidget()

    grid = QGridLayout(w)
    grid.addWidget(QPushButton("Button one"),0,0)
    grid.addWidget(QPushButton("Button two"),0,1)
    grid.addWidget(QPushButton("Button three"),1,0)
    grid.addWidget(QPushButton("Button four"),1,1)


    w.show()
    sys.exit(app.exec_())

这就是网格的样子:

您还可以将 rowspan 和 colspan 参数传递给 addWidget() 以跨越多个行或列。

例如,

grid.addWidget(QPushButton("Button five"),2,0,1,0)

这将创建一个横跨两列的按钮。

主题

PyQt5 带有一些可以在应用程序中使用的内置主题。 setStyle() 在 QApplication 实例上调用的方法用于为您的应用程序设置特定主题。

例如,添加以下代码行会将您的应用程序的主题从默认更改为 Fusion

app.setStyle("Fusion")

这就是上一个示例在 Fusion Theme 中的外观

另一个对应用程序进行主题化的有用函数是 setPalette() 方法。这是使用 setPalette() 更改不同小部件颜色的代码。

import sys
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import *
from PyQt5.QtGui import QPalette

if __name__ == "__main__":
    app = QApplication([])
    app.setStyle("Fusion")
    
    qp = QPalette()
    qp.setColor(QPalette.ButtonText, Qt.black)
    qp.setColor(QPalette.Window, Qt.black)
    qp.setColor(QPalette.Button, Qt.gray)
    app.setPalette(qp)

    w = QWidget()

    grid = QGridLayout(w)
    grid.addWidget(QPushButton("Button one"),0,0)
    grid.addWidget(QPushButton("Button two"),0,1)
    grid.addWidget(QPushButton("Button three"),1,0)
    grid.addWidget(QPushButton("Button four"),1,1)


    w.show()
    sys.exit(app.exec_())

这是结果。

要使用 setPalette() 方法,您首先需要定义一个调色板。这是通过创建 QPalette 类的对象来完成的。

 qp = QPalette()

请注意,QPalette 类属于 QtGui 模块,您需要导入它才能使其工作。创建 QPalette 对象后,使用 setColor() 方法传递要更改其颜色的小部件的名称以及要设置的颜色。

 qp.setColor(QPalette.Window, Qt.black)

这会将窗口的颜色更改为黑色。定义好配色方案后,使用 setPalette() 函数将调色板应用到您的应用程序。

app.setPalette(qp)

如果您想为您的应用程序创建一些基本主题,这就是您需要做的一切。 PyQt 还允许您使用样式表来定义小部件的外观。如果您熟悉 CSS,则可以使用 Qt 样式表轻松为您的应用定义高级样式。

总结


Python

  1. C# 集合教程与示例
  2. Python Print() 语句:如何通过示例打印
  3. 带有示例的 Python 字符串计数()
  4. Python String format() 举例说明
  5. Python String find() 方法及示例
  6. 带有示例的 Python Lambda 函数
  7. 带有示例的 Python round() 函数
  8. 带有示例的 Python map() 函数
  9. Python Timeit() 与示例
  10. 集合中的 Python 计数器示例
  11. Python 中的 type() 和 isinstance() 示例
  12. 带有示例的 Python 列表计数()