wuhuacong(伍华聪)的专栏
在之前随笔《使用PySide6/PyQt6实现Python跨平台通用列表页面的基类设计》中也介绍过对于基于Python对桌面应用开发的处理,针对常规列表界面的基类做了封装,以便适应比较丰富且弹性化界面的要求,并且减少子类的代码处理,本篇随笔进一步探讨使用PySide6/PyQt6或者WxPython实现对列表界面和树列表界面的整合处理这个主题。
1、使用PySide6/PyQt6实现对列表界面和树列表界面的整合处理
基于重用及减少子类代码的目的,我们抽象了列表界面的基类,我们业务列表界面只需要继承基类,并在构造函数提供相应的信息即可比较弹性化的处理界面多元化的问题。
对于常规的列表界面,一般包括查询条件、列表界面(包括分页信息)等元素,如下界面所示。
实际业务的界面可能如下所示。
使用PySide6/PyQt6 的桌面端开发的时候,我们初始化业务类,并传递相关参数给基类列表界面构造处理即可,如下构造函数处理所示。
而有时候,界面上有时候需要搭配树列表进行快速查询或展示的需要,因此也需要在基类中进行一定的抽象处理,以便子类能进一步减少代码。
那么我们通过参数条件进行指定,如果条件符合,那么构建树列表界面即可。
如用户列表界面中,我们需要展示用户部门、用户角色的分类信息,如下所示。
用户管理界面的列表界面如下所示。
那么我们只需要在子类的构造函数处理上,我们只需要设置参数 use_left_panel = True,并且实现 create_tree_panels 函数即可。
我们在基类中和子类的分工中,基类剥离实际业务具体细节,而在高纬度上进行内容的组合即可。
如在基类窗体中,其中的
_create_content_panel
是基类构建主查询面板内容的逻辑,其中包括输入条件展示、常见按钮显示、以及列表、分页栏目等。基类负责组合这些元素在一起即可,具体细节下沉到子类进行处理。
如对于用户列表界面的树列表界面,我们只需要在子类FrmUser中重写函数
create_tree_panels
即可,然后在通过构造函数创建两个自定义树列表控件即可,如下所示。可以看到界面代码比较简洁,关注点只需要集中在创建树列表即可。
那么运行后就会在基类自动组装中,会展示到主列表界面的左侧了。
虽然我们在创建树列表的时候,会创建对应的右键菜单,如下界面所示。
不过有时候为了直观功能的展示,我们可能希望在树列表的顶部增加一些常规的按钮,如新增、刷新等,那么子类如何进阶来实现了。
那么我们可以对树列表控件进行进一步的封装下,增加一个函数来处理下即可,如下所示。
然后在封装的函数中进一步包装下界面后返回给字典集合即可。
整合后界面就可以看到新增的按钮集合了,这样具体细节还是交给子类,父类没有进行干涉,逻辑和细节分离。
2、使用WxPython实现对列表界面和树列表界面的整合处理
对于上面的使用PySide6/PyQt6实现树列表+常规列表的展示处理,在使用WxPython 的桌面端开发的时候,也是类似的处理方式。
业务列表窗体界面一般也是分为两个部分
对于常规的展示列表界面,列表界面一般分为查询区、列表界面展示区和分页信息区,我们把它分为两个主要的部分,如下界面所示。
在开始的用户界面如下所示。
我们在父类窗体中定义一个开关变量,用来开启或者关闭左侧树列表面板的,如下代码所示。
这样构建树列表就交给函数 create_tree_panels 实现即可,它会构建一到多个的树列表,父界面窗体负责整合它们显示即可。
对于业务的客户信息列表界面,生成的代码如下所示(以客户信息表为例):
对于上面用户业务界面来说,也是类似PySide/PyQt的界面代码,因为我们为基类的接口提供了类似的实现。
同样来说,如果我们需要再树列表的顶部增加一些操作按钮显示,那么使用对应的封装函数来返回一个新的面板即可。如下代码所示。
具体的封装函数,我们在WxPython项目类中实现即可,基本上没有太多的差异。
最后在WxPython项目的显示界面效果如下所示。
可以看到,不管是WxPython的界面,还是PySide/PyQt的运行界面,在列表窗体的基类,相同的抽象函数处理逻辑下,都非常的方便,处理的代码也很类似,因此掌握两个不同Python的组件UI的界面开发,在开发框架的友好加持下,会变得非常方便和简便,开发项目起来,会事半功倍,更不用说会有代码生成工具上的支持了。
选择相关的数据表后,一键生成相关的代码,如下所示。