(目录)
介绍一个VSCode轻量级 Rest API 客户端插件:Thunder Client
一、关于shebang
- 明确指定解释器
#!/usr/bin/python3
- 在shell中寻找第一个python解释器
#!/usr/bin/env python3
二、Python类的私有方法/属性
Python不支持私有方法/属性,但可以将类成员方法/属性名定义为形如“__xxx”,如要访问可通过“_class__xxx”来访问,相当于做了一个“障眼法”,以避免你无意的破坏。这种做法相当于定义了私有成员。
三、PyQt图形界面的使用
1. PyQt和PySide的区别
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”
-
配置 “Pyuic” 和 “Qt Designer” 的路径
- Pyuic的路径通常位于Python环境下的Scripts\pyuic6.exe
- Qt Designer的路径通常位于Python环境下的Lib\site-packages\qt6_applications\Qt\bin\designer.exe。或者单独安装Qt6,这样Qt Designer安装结果如下:
- 打开Qt Designer界面
在VSCode资源管理器中右键点击项目目录,选择 “PYQT: New Form”,这将打开Qt Designer界面。
在设计好GUI界面后(比如新建Widget),可以生成.ui文件(实际是个XML文件),并通过编译将其转换为.py文件。编译方法如下:
pyuic6 hello_qt.ui -o hello_qt.py
或者在VSCode的界面中完成:
选择PYQT: Compile Form
随后用主程序调用生成的.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可以编辑信号与槽,如下:
看下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/。
标签:__,sys,Python,GUI,PyQt6,乱码,ui,import,app From: https://blog.51cto.com/cerana/11920737