简介
- Tkinter – Tcl/Tk的python接口,python标准库自带不需单独安装。但界面相对简陋,基础组件不全,框架功能相对较弱,使用不多
- wxPython – wxWidgets的python封装接口
- PySimpleGUI – 对tkinter, Qt, WxPython等python gui框架的进一步封装
- PyQt – Riverbank Computing公司发布的对QT框架的python封装,GPL授权
- PySide – QT官方发布的QT python封装,LGPL授权,可以闭源发布。 qt官方给出的Pyside和PyQt差异,除了包名、工具名外,大部分差别不大
从目前使用情况来看,PyQt使用的比较多,但PyQt是GPL授权,而PySide是LGPL授权,其功能与PyQt区别不大,但可以闭源发布。量化软件vnpy最新版使用的就是pyside6,下文主要介绍pyside6。
pyside6介绍
- 安装
安装前提:Python 3.6+。使用venv或conda创建一个新的python环境。or1
2conda create -n qt python=3.8
conda activate qt然后使用pip安装pyside61
2python -m venv pyside
source pyside/bin/activate测试安装是否成功1
2pip install pyside6 # 安装最新版本
pip install pyside6==6.0 # 安装6.0版本除了pyside6 lib库安装好外,还安装了pyside6-designer、pyside6-uic、pyside6-rcc等工具。1
2
3
4
5>>> import PySide6.QtCore
>>> print(PySide6.__version__)
6.2.1
>>> print(PySide6.QtCore.__version__)
6.2.1
- pyside6-uic: 从.ui文件生成python代码,
pyside6-uic -i form.ui -o ui_form.py
- pyside6-rcc: 从.qrc文件生成python代码,
pyside6-rcc -i resources.qrc -o rc_resources.py
- pyside6-designer: Qt Designer对应的命令行程序,用于编辑/创建.ui文件
- hello qt程序
将下列代码保存为hello_py.py,在终端运行python hello_py.py即可。说明:1
2
3
4
5
6
7import sys
from PySide6.QtWidgets import QApplication, QLabel
app = QApplication(sys.argv)
label = QLabel("Hello Qt for Python!")
label.show()
app.exec()
- QLabel是一个可以展示文本和图片的组件,文本可以是普通文本或富文本,比如html
- QApplication app.exec()进入Qt主循环并且开始执行Qt代码
- 开发环境
- vs code安装插件:Qt for Python
- qt creator
- pycharm配置外部工具
- 核心概念
Qt包括很多组件和模块,比如qtbase是一个包含很多模块的基础组件,它包含的module有:QtCore, QtGui, QtWidgets, QtNetwork等。所有这些module包含了很多你可以直接使用的类,比如QtCore里面包含了QFile, QTime, QByteArray等类。
QtWidgets是一个提供了很多预定义Widgets的模块,这些Widgets你可以添加到图形应用程序里面,包括Buttons, Labels, Boxes, Menus等。
QML提供了另外一种不同于Widgets的创建用户界面的方法,它首先的动机是应用于移动应用开发,但也可以在桌面应用开发中使用。QML跟Qt Quick模块一起,提供了使用点击、拖放、动画、过渡等与移动设备交互的方式。你可以在QML/Quick应用中找到的元素都聚焦于提供更现代的应用中
Qt基本模块有三部分:
- QtCore: 提供了核心的非GUI功能,比如signal和slots,properties,序列化等
- QtGui: 在GUI功能上扩展了QtCore的功能,比如:Events, windows and screens, OpenGL and raster-based 2D绘图,还有图片
- QtWidgets: 提供了现成的组件,包括UI的图形元素
QML and Qt Quick使用这些模块从python跟QML语言交互
- QtQML: 跟模块交互的基础python api
- QtQuick: 在Qt应用中提供了类嵌入Qt Quick
- QtQuickWidgets: 在基于widget的应用中提供了QQuickWidget类来前乳Qt Quick
- Shiboken模块:使用python来扩展Qt/C++ 应用
- Qt Widgets:
- signals and slots: 用于QObject对象之间的通信。按钮点击时,click就是信号,槽位是当按钮被点击时发生的事情,比如关闭窗口,保存文件等。类似于其他的callback回调,但回调不是很自然
- 所有继承自QObject或它的子类的类(比如QWidget)都可以包含信号和槽位。当对象改变状态,且这个状态其他对象感兴趣时,对象可以发出信号
- 槽位可以用于接收信号,但他们也是普通成员函数。就像一个对象不知道是否有对象接收了它的信号一样,一个槽位也不知道是否有信号连接到它了。这确保了可以用Qt来创建真正独立的组件
- 一个槽位可以连接任意多的信号,一个信号也可以连接到任意多的槽位。连接一个信号到另外一个信号也是可能的
- Qt widgets有许多预定义的信号和槽位,你可以创建继承自PySide6 widgets的任何类
- Qt 自带的layout-support功能可以帮你在应用程序中组织widgets。QVBoxLayout用于垂直布局widgets,QTableWidget用于以表格形式展示信息, QTreeWidget,QTreeView用树的形式展示信息
- 使用ui文件
Qt Designer时一个图形UI设计工具,可以使用 Qt Designer基于Qt Widgets创建图形界面,它作为一个单独程序pyside6-designer或者嵌入到Qt Creator IDE。Using Qt Designer.设计存储在.ui文件中,是基于XML格式的文档. 可以使用pyside6-uic在编译时将设计转换成python/c++代码。
可以使用QtUiTools模块里面的类来直接加载ui文件
- 其他功能
Using .qrc Files (pyside6-rcc) – Qt资源系统是一个可以用来在应用程序中存储二进制文件的机制,这些文件可以嵌入到应用程序并且可以被QFile类和QIcon、QPixmap类的构造函数来访问,文件名用:/来开始。最常见的使用情况时自定义的图片、图标、字体等
Qt Linguist和它相关的工具可以用来提供应用程序多语言的翻译功能,参考Translating Applications
Qt Widgets应用使用一个依赖于底层平台的默认主题。在某些情况,存在一些系统范围的配置可以用来修改Qt主题,也可以自己的widgets并为每个组件提供一个自定义的style. 参考Styling the Widgets Application
QML是一个声明式语言,可以让你比传统语言(c++)更快的开发应用程序。由于它的声明特性,非常适合设计应用程序的UI。在QML,一个用户界面被指定为带有属性的对象树
一个PySide6/QML应用程序由至少2个不同的文件组成–一个是QML描述的用户界面文件,另外一个是用于load QML文件的python文件。QtQml和QtQuick模块提供了基于QML的UI的必要功能
Shiboken 擅长Qt相关的binding生成,这意味着任何Qt/C++项目可以很容易暴露给python。另外,Shiboken也提供了对于非Qt的c++项目的支持
进阶
- 费用工具教程
- 更多pyside示例–在pyside6安装环境site-packages/PySide6/examples目录下,包括3d、画图、多媒体、网络、数据可视化等多个分类
- vnpy qt
交流
我发文章的几个地方,欢迎大家在朋友圈等地方分享,多多交流。
- 微信公众号:诸葛说talk
- 知乎:https://www.zhihu.com/people/richard-zhu/posts
- 博客:https://rchardzhu.github.io/
参考
- 为什么很多Python开发者写GUI不用Tkinter,而要选择PyQt和wxPython或其他?
- PyQt和PySide的历史渊源
- Qt for Python官方完整教程
- Qt for Python快速开始 – pyside6快速开始
- pyside概念篇
- pyside所有模块
- pyside教程–包括Qt Widgets、Quick/QML、General Applications基础教程
- 将应用程序分发到其他系统/平台 – 使用fbs、PyInstaller、cx_Freeze、briefcase、py2exe、Nuitka等工具打包python程序
- 模型/视图编程
- fbs – fbs解决了常见的打包和部署问题,基于Python和Qt, fbs是Electron的一个轻量级替代品
- electron – 非python。使用 JavaScript,HTML 和 CSS 构建跨平台的桌面应用程序
- electron-vue – 非python。 使用vue构建electron应用的模版项目