在前面的《Python开发》中主要介绍了FastAPI的后端Python开发,以及基于WxPython的跨平台GUI的开发过程,由于PySide6/PyQt6 在GUI的用途上也有很大的优势,因此把原先完成的WxPython 开发框架改造成使用PySide6/PyQt6实现Python跨平台GUI框架的开发过程,本篇随笔介绍它们之间项目联系和不同,主要针对PySide6/PyQt6 的特性进行不同的分解介绍。
1、技术架构体系--一个中心,多个前端
基于PySide6/PyQt6实现的 Python跨平台桌面端GUI框架,和WxPython的跨平台桌面端一样,都是是整个架构体现的一部分,一个Web API中心,同时提供多个接入的终端,如下架构图所示。
PySide6 和 PyQt6 开发上基本上已经趋向大同,很多时候只需要替换一下前面的命名空间即可,因此PySide6 和 PyQt6 开发上已没有多少差异,QT的官方已经把PySide作为Python的GUI 标准案例进行文档介绍了。

其中的Python + FastAPI项目是一个Web API的项目,为各个前端提供接口的后端项目,其界面自动整合Swagger的文档界面,如下所示。

单个模块包含很多通用的接口,通用的接口能满足90%以上的功能需求,以及一些额外的自定义接口。如下是客户信息模块的接口列表。

该后端接口采用统一的接口协议,具有统一的协议规范和定义。标准协议如下所示。
{
"success": false,
"result": T ,
"targetUrl": "string",
"UnAuthorizedRequest": false,
"errorInfo": {
"code": 0,
"message": "string",
"details": "string"
}
}
结合泛型的方式,这样定义可以很好的抽象不同的业务类接口到基类BaseApi中,这样增删改查等处理的接口都可以抽象到BaseApi里面了。
权限模块我们涉及到的用户管理、机构管理、角色管理、菜单管理、功能管理、操作日志、登录日志等业务类,那么这些类继承BaseApi,就会具有相关的接口了,如下所示继承关系。

因此在前端、后端都可以广泛的使用基类抽象的方式,实现绝大多数接口的封装处理。

2、PySide6/PyQt6实现Python跨平台的桌面前端的基类设计
对于桌面前端,由于大多数情况下,界面的表现逻辑可以使用不同的规则进行抽象,如自定义控件、列表界面、弹出对话框界面等,我们把它抽象出来进行不同的处理。子类界面进行一定程度的扩张即可获得更好的使用、更简化的代码。

对于自定义控件,我们对其封装,使之能够在开发使用习惯上更一致,下面是我们根据需要对常见的原生控件进行一些自定义控件的封装列表。

自定义控件在提供一致的接口上,也可以更有效的提供一些特殊接口,如简化字典数据的绑定处理等。

对于列表和对话框界面的封装,能够简化对泛型模型数据的统一处理,因此可以简化继承子类的代码,提供代码维护开发和维护的效率。

3、PySide6/PyQt6实现Python跨平台的桌面前端的界面展示
完成了基础部分的自定义控件、对话框窗口、列表窗体、API调用封装等方面的处理后,就可以基于这些基础上进行界面的开发了。
登录界面效果如下。

和WxPython的跨平台界面效果一样,该框架也是一个多文档管理界面,其中用户管理界面如下所示。

列表包含有有树形列表、条件查询框、通用条件(查询、新增、编辑、删除、导出)等、列表展示、分页导航等内容。这些都是在基类中进行了统一的抽象处理,子类根据需要调整属性或重写相关函数即可实现个性化的界面定义。
树列表或者表格控件,右键可以弹出相关的右键菜单

在列表界面中,选择新增、编辑,会弹出模态对话框进行数据展示或者编辑处理。

参数配置界面效果如下所示

通用字典信息的管理如下所示。

批量新增字典项目界面如下。

系统中统一展示和选择图标的界面如下所示。

其他界面就不再一一介绍,有空再继续细化各个模块的开发总结。
4、WxPython桌面前端的界面展示
对照上面的PySide6/PyQt6实现Python跨平台GUI框架界面,我们把WxPython相关的界面对比一下,先有一个直观的感受。

树列表或者表格数据控件支持右键弹出菜单处理。

在列表界面中,选择新增、编辑,会弹出模态对话框进行数据展示或者编辑处理。

参数配置界面效果如下所示

通用字典信息的管理如下所示。

系统中统一展示和选择图标的界面如下所示。
