体验一把Python图形界面开发,真爽

3,010 阅读5分钟

本文路老师准备去玩玩pyqt6的功能,我会用大概二十天的时间玩转pyqt6,并制作出来好玩又实用的项目。

1 介绍

PyQt6 是由 Riverbank Computing 公司开发的基于 Python 的一系列多平台的工具包,可以在 UNIX、Windows 和 mac 等主流操作系统上运行。本文着重来尝试使用 pyqt6,以及未来利用 pyqt6 来实现一些

有意思的桌面应用。比如开发画图板,截图工具,视频音频播放器,以及利用 PyQt6 来进行科学研究结果的展示。

2 安装 PyQt6

安装 PyQt6 之前需要保证你已经安装了 python 环境,然后利用 python 包管理工具 pip 进行安装 pyqt6:

pip install pyqt6

image.png PyQt6 设计图形界面程序有两种基本方式。

  • 在 PyQt6 安装后,采用 Python 自带或者第三方提供的 IDLE 开发 PyQt6 的程序。
  • 在 PyQt6 安装后,再安装配套的工具包 QtTools,通过其包含的 Qt Designer 可视化工具设计功能界面形成 UI 文件,将其转换为 py 文件,再编译实现功能的代码,与界面程序一起配合运行,或者直接修改 UI 文件,转换为 py 文件,加入实现功能的代码。(我们开发推荐使用这一种)

首先我们先尝试直接利用第一种方式编写程序来实现一个计算圆面积和周长的程序。效果如下:

image.png

下面是实现代码:

import math
import sys

from PyQt6 import QtCore, QtGui, QtWidgets
from PyQt6.QtWidgets import QWidget, QApplication


class Ui_Form(QWidget):
    def __init__(self):
        super(Ui_Form, self).__init__()
        self.setupUi(self)
	#UI界面
    def setupUi(self, Form):
        Form.setObjectName("Form")
        Form.resize(348, 349)
        self.label = QtWidgets.QLabel(parent=Form)
        self.label.setGeometry(QtCore.QRect(80, 90, 53, 15))
        self.label.setObjectName("label")
        self.label_2 = QtWidgets.QLabel(parent=Form)
        self.label_2.setGeometry(QtCore.QRect(80, 140, 53, 15))
        self.label_2.setObjectName("label_2")
        self.label_3 = QtWidgets.QLabel(parent=Form)
        self.label_3.setGeometry(QtCore.QRect(80, 200, 53, 15))
        self.label_3.setObjectName("label_3")
        self.leRadius = QtWidgets.QLineEdit(parent=Form)
        self.leRadius.setGeometry(QtCore.QRect(130, 90, 113, 21))
        self.leRadius.setObjectName("leRadius")
        self.leLength = QtWidgets.QLineEdit(parent=Form)
        self.leLength.setGeometry(QtCore.QRect(130, 140, 113, 21))
        self.leLength.setObjectName("leLength")
        self.leLength.setReadOnly(True)
        self.leLength.setStyleSheet("background-color:#c3c3c3")
        self.leArea = QtWidgets.QLineEdit(parent=Form)
        self.leArea.setGeometry(QtCore.QRect(130, 190, 113, 21))
        self.leArea.setObjectName("leArea")
        self.leArea.setReadOnly(True)
        self.leArea.setStyleSheet("background-color:#c3c3c3")
        self.pushButton = QtWidgets.QPushButton(parent=Form)
        self.pushButton.setGeometry(QtCore.QRect(130, 270, 75, 23))
        self.pushButton.setObjectName("pushButton")
        self.pushButton.clicked.connect(self.calCircle)

        self.retranslateUi(Form)
        QtCore.QMetaObject.connectSlotsByName(Form)

    def retranslateUi(self, Form):
        _translate = QtCore.QCoreApplication.translate
        Form.setWindowTitle(_translate("Form", "计算圆的面积"))
        self.label.setText(_translate("Form", "半径:"))
        self.label_2.setText(_translate("Form", "周长:"))
        self.label_3.setText(_translate("Form", "面积:"))
        self.pushButton.setText(_translate("Form", "计 算"))
	#计算元的面积和周长
    def calCircle(self):
        r = int(self.leRadius.text())
        if r > 0:
            length = round(2 * math.pi * r, 2)
            area = round(math.pi * r * r, 2)
            self.leLength.setText(str(length))
            self.leArea.setText(str(area))
#添加main方法,运行程序
if __name__ == '__main__':
    app = QApplication(sys.argv)
    ui = Ui_Form()
    ui.show()
    sys.exit(app.exec())

3 pyqt6-tools 安装

我们采用第二种方式来设计就会简单很多,不用一个按钮一个按钮的通过代码实现了。首先安装 pyqt6-tools 工具。

pip install pyqt6-tools

pyqt6-tools 里包含两个关键工具:1.设计器 Qt Designer;2.文件转换工具。

  • 设计器 Qt Designer

QtDesigner 是用来设计 PyQt6 程序界面的工具,它的启动文件是 designer.exe,默认位于用户计算机 python 安装目录 qt6_application\Qt\bin\路径下。

  • 文件转换工具 PyUIC

用设计器 Qt Designer 设计好的界面保存为 UI 文件,需要通过 PyUic 将其转化成 python 源文件才能使用。

转换方式如下:

Pyuic6 -o 界面文件名.py 界面文件名.ui

4 Qt Designer 界面

Qt designer 设计器页面如下,左侧为窗口部件盒,中间为设计区,右侧为对象检查器、属性编辑器、资源浏览器等子窗口。 image.png

设计圆周长面积计算的界面如上图,我们只需要拖拽输入框和 label 标签以及计算按钮就可以实现页面的设计。

内容描述
半径(文字部分)QLabel半径文字,周长面积文字都类似
半径输入框QLineEdit半径文字后面的输入框,输入框一般都是使用 QLineEdit
计算QPushButton计算按钮

image.png 保存后的文件是这样的:

image.png

我们需要通过 PyUic 进行转换,转换后的是这样的:

image.png

其代码内容如下:

# Form implementation generated from reading ui file '计算圆的周长面积.ui'
#
# Created by: PyQt6 UI code generator 6.4.2
#
# WARNING: Any manual changes made to this file will be lost when pyuic6 is
# run again.  Do not edit this file unless you know what you are doing.


from PyQt6 import QtCore, QtGui, QtWidgets


class Ui_Form(object):
    def setupUi(self, Form):
        Form.setObjectName("Form")
        Form.resize(348, 349)
        self.label = QtWidgets.QLabel(parent=Form)
        self.label.setGeometry(QtCore.QRect(80, 90, 53, 15))
        self.label.setObjectName("label")
        self.label_2 = QtWidgets.QLabel(parent=Form)
        self.label_2.setGeometry(QtCore.QRect(80, 140, 53, 15))
        self.label_2.setObjectName("label_2")
        self.label_3 = QtWidgets.QLabel(parent=Form)
        self.label_3.setGeometry(QtCore.QRect(80, 200, 53, 15))
        self.label_3.setObjectName("label_3")
        self.leRadius = QtWidgets.QLineEdit(parent=Form)
        self.leRadius.setGeometry(QtCore.QRect(130, 90, 113, 21))
        self.leRadius.setObjectName("leRadius")
        self.leLength = QtWidgets.QLineEdit(parent=Form)
        self.leLength.setEnabled(False)
        self.leLength.setGeometry(QtCore.QRect(130, 140, 113, 21))
        self.leLength.setObjectName("leLength")
        self.leArea = QtWidgets.QLineEdit(parent=Form)
        self.leArea.setEnabled(False)
        self.leArea.setGeometry(QtCore.QRect(130, 190, 113, 21))
        self.leArea.setObjectName("leArea")
        self.pushButton = QtWidgets.QPushButton(parent=Form)
        self.pushButton.setGeometry(QtCore.QRect(130, 270, 75, 23))
        self.pushButton.setObjectName("pushButton")

        self.retranslateUi(Form)
        QtCore.QMetaObject.connectSlotsByName(Form)

    def retranslateUi(self, Form):
        _translate = QtCore.QCoreApplication.translate
        Form.setWindowTitle(_translate("Form", "计算圆的面积"))
        self.label.setText(_translate("Form", "半径:"))
        self.label_2.setText(_translate("Form", "周长:"))
        self.label_3.setText(_translate("Form", "面积:"))
        self.pushButton.setText(_translate("Form", "计 算"))

然后,我们可以直接在这里添加 main 函数(注意和上面的 main 不一样),实现运行效果:

#添加main方法,运行程序
if __name__ == '__main__':
    app = QApplication(sys.argv)
    ui = uic.loadUi("./计算圆的周长面积.ui")
    ui.show()
    sys.exit(app.exec())

image.png

5 Pyinstaller 打包工具安装使用

之后添加相应的功能实现,就可以利用 PyInstaller 进行打包了,我们先安装 PyInstaller

pip install pyinstaller

image.png

我们利用 PyInstaller 进行打包:

image.png image.png

成功打包程 exe 文件:

image.png

双击运行如下:

image.png