(目录)


介绍一个VSCode轻量级 Rest API 客户端插件:Thunder Client

一、关于shebang

  • 明确指定解释器
#!/usr/bin/python3
  • 在shell中寻找第一个python解释器
#!/usr/bin/env python3

二、Python类的私有方法/属性

Python不支持私有方法/属性,但可以将类成员方法/属性名定义为形如“__xxx”,如要访问可通过“_class__xxx”来访问,相当于做了一个“障眼法”,以避免你无意的破坏。这种做法相当于定义了私有成员。

三、PyQt图形界面的使用

1. PyQt和PySide的区别

image.png

2. 在VSCode中搭建PyQt6的开发环境

  • 安装软件包
pip install PyQt6
pip install pyqt6-tools

测试安装结果

from PyQt6.QtWidgets import QApplication, QWidget, QLabel
import sys

app = QApplication(sys.argv)  # 创建一个应用
print(sys.argv)
print(app.arguments())

window = QWidget()
window.setWindowTitle("开始学习PyQt6")
window.resize(400, 300)
window.move(100, 300)
window.show()

label = QLabel()
label.setText("来吧,一起学习PyQt6吧!")
label.move(80, 80)
label.resize(150, 50)
label.setStyleSheet("background-color:yellow;padding:10px")
label.setParent(window)
label.show()

sys.exit(app.exec())  # 开始执行程序,并且进入消息循环等待
  • 安装插件 “PYQT Integration” image.png

  • 配置 “Pyuic” 和 “Qt Designer” 的路径 image.png
    image.png
    image.png

  • Pyuic的路径通常位于Python环境下的Scripts\pyuic6.exe
  • Qt Designer的路径通常位于Python环境下的Lib\site-packages\qt6_applications\Qt\bin\designer.exe。或者单独安装Qt6,这样Qt Designer安装结果如下: image.png
  • 打开Qt Designer界面 在VSCode资源管理器中右键点击项目目录,选择 “PYQT: New Form”,这将打开Qt Designer界面。 image.png
    在设计好GUI界面后(比如新建Widget),可以生成.ui文件(实际是个XML文件),并通过编译将其转换为.py文件。编译方法如下:
pyuic6 hello_qt.ui -o hello_qt.py

或者在VSCode的界面中完成: 选择PYQT: Compile Form
image.png

随后用主程序调用生成的.py类文件即可。

可以将生成的python打包为EXE文件,然后使用Inno Setup(https://jrsoftware.org)制作安装包——如果配置脚本中有中文,需要改成GBK编码。

测试用主程序如下:

import sys
from PyQt6.QtWidgets import QApplication, QWidget
from Ui_hello_qt import (
    Ui_Form,
)  # designer生成的UI文件,通过pyuic编译生成的类Ui_Form,在此处被导入


class MainForm(QWidget):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.__ui = Ui_Form()
        self.__ui.setupUi(self)


if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = MainForm()
    window.show()
    sys.exit(app.exec())

也可以:

import sys
from PyQt6.QtWidgets import QApplication, QWidget
from Ui_hello_qt import (
    Ui_Form,
)  # designer生成的UI文件,通过pyuic编译生成的类Ui_Form,在此处被导入

if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = QWidget()
    Ui_Form().setupUi(window)
    window.show()
    sys.exit(app.exec())

还可以

import sys
from PyQt6.QtWidgets import QApplication
from PyQt6 import uic

if __name__ == "__main__":
    app = QApplication(sys.argv)

    ui = uic.loadUi("GUI/hello_qt.ui")
    ui.show()

    sys.exit(app.exec())

3. 加载QSS样式文件

QSS类似CSS,用于描述控件的样式。

  • QSS样式文件
# 下边的label2是控件的objectName,这里的井号是选择器。不加井号就选中所有QLabel控件对象。
QLabel#label2 {
    background-color: #f4f2c9;
    color: #d80d28;
    font-size: 16px;
    font-weight: bold;
}
  • 使用代码加载QSS
import sys
from PyQt6.QtWidgets import QApplication
from PyQt6 import uic

if __name__ == "__main__":
    app = QApplication(sys.argv)

    with open("GUI/label2.qss", "r") as f:
        app.setStyleSheet(f.read())

    ui = uic.loadUi("GUI/hello_qt.ui")
    ui.setWindowTitle("Hello Qt")
    ui.label2.setText("Hello foo!") # label2是控件的objectName

    ui.show()

    sys.exit(app.exec())
  • 利用QSS批量设置控件样式 QSS样式文件
QLabel[level="error"] {
    color: red;
    font-size: 18px;
}

QLabel[level="warning"] {
    color: blue;
    font-size: 18px;
}

使用代码设置样式(这里利用到了控件的自定义属性)

import sys
from PyQt6.QtWidgets import QApplication
from PyQt6 import uic

if __name__ == "__main__":
    app = QApplication(sys.argv)

    with open("GUI/label.qss", "r") as f:
        app.setStyleSheet(f.read())

    ui = uic.loadUi("hello_qt.ui")

    label_1 = ui.label_1
    label_2 = ui.label_2
    label_3 = ui.label_3
    label_1.setProperty("level", "warning")
    label_2.setProperty("level", "error")
    label_3.setProperty("level", "error")

    ui.show()

    sys.exit(app.exec())

4. 在VSCode中为python程序的执行设置命令行参数

首先安装插件:Code Runner 在项目根目录的.vscode/中,配置settings.json

{
    "code-runner.executorMap": {
        "python": "set PYTHONIOENCODING=utf8 && D:/python_envs/py3d11/python -u $fileName arg1 arg2 arg3"
    }
}

然后run code(Ctrl + Alt + N)。这里 “arg1 arg2 arg3” 就是命令行参数。

“$fileName”表示当前目录下的文件名。也可以使用绝对路径文件名“$fullFileName”。

5. 解决Windows控制台默认编码GBK导致的输出乱码问题

  • 代码级解决方法 在向终端输出前使用如下代码
import io
import sys

sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding="utf8")
# 下边是print()语句
  • 命令级解决方法 在执行的命令前加入环境变量的设置
set PYTHONIOENCODING=utf8 && D:/python_envs/py3d11/python -u demo.py
  • 系统级解决方法 为Windows操作系统配置环境变量
PYTHONIOENCODING=UTF8

记得重启VSCode,使配置生效。

6. 信号与槽函数

信号就是事件,槽函数就是事件处理函数。可以形象地将信号看成玻璃珠,这些不同颜色的玻璃珠子倒出来会被不同的凹槽接住——实施处理。 Qt designer可以编辑信号与槽,如下: image.png
image.png
image.png
看下ui通过pyuic自动生成的代码:

self.pushButton.clicked.connect(self.pushButton.close)

完整代码案例:

import sys
from PyQt6.QtWidgets import QApplication, QPushButton, QMessageBox
from PyQt6 import uic


def say_hello():
    msgBox = QMessageBox()
    msgBox.setIcon(QMessageBox.Icon.Information)
    msgBox.setWindowTitle("提示")
    msgBox.setText("你好")
    msgBox.setStandardButtons(QMessageBox.StandardButton.Ok)
    msgBox.exec()


if __name__ == "__main__":
    app = QApplication(sys.argv)

    ui = uic.loadUi("GUI/hello_qt.ui")

    pbt: QPushButton = ui.pushButton2
    pbt.clicked.connect(say_hello)
    # 或者使用lambda函数形式
    # pbt.clicked.connect(lambda: say_hello(这里可以带参数列表))

    # 一个信号可以发给多个槽函数来接收处理
    """
    pbt.clicked.connect(lambda: calc(1, int(lineEdit_2.text()), 3))
    pbt.clicked.connect(lambda: set_style(lineEdit_3))
    """
    ui.show()

    sys.exit(app.exec())

代码中的“:”和“->”分别用于注释变量类型和返回值类型。只是用于注释,没有实际的语法作用。

四、PyQt6程序的打包发布

使用Pyinstaller

pip install pyinstaller -i https://mirrors.aliyun.com/pypi/simple

1. 打包普通python程序

普通Python程序指的是完全使用Python内置模块或者对象实现的程序,程序中不包括任何第三方模块。

pyinstaller -F -i your_ico.ico your_script.py

下面是一些常用的命令行选项:

-F:将所有文件打包为一个单独的可执行文件。
-D:将所有文件打包为一个目录,包含可执行文件和所有依赖的文件。
-c:将程序与命令提示符结合在一起,以便在命令提示符下运行。
-d:将调试信息打包进可执行文件中。
-F, --onefile:将所有文件打包为一个单独的可执行文件。
-o:指定输出文件的位置。
-w:打包为窗口文件。
-p DIR, --paths DIR:设置导入路径(多个路径用;分隔),从而导入需要的模块
-i, --icon 指定ico图标文件

在dist目录可以找到打包生成的exe可执行文件。

2. 打包PyQt6程序

关键是要引入PyQt6的依赖包。

# pyinstaller -p PyQt6模块路径 -Fw --icon=窗口图标文件.ico 文件名.py
pyinstaller -p D:\python_envs\py3d11\Lib\site-packages\PyQt6\Qt6\bin -Fw -i dog.ico main.py

需要将依赖的ui,图片等资源文件与打包生成的exe文件放入相同的文件夹,比如dist/。