为了兼容Python的扩展性系统框架,要将VS写的软件用Python重构。由于Python的GUI出了名的坑:wxPython构造不便,PyQt由于前后台数据传递的关系没准和VS一样成了一团糟,于是考虑用Flask的模式,将前后端分离。前端用HTML+CSS+js做显示渲染,后端用Python构造算法和控制逻辑,异步显示的问题用js完成。
虽然是本地应用,但这样设计的好处在于:
- 完全分离了显示和算法的代码,使得并行开发成为可能。且专门负责显示和专门负责算法控制相互独立,测试起来也方便;
- 前端用HTML+CSS+js的显示效果,比起灰溜溜的Win32程序,要漂亮得多;
- Flask是基于Python的天然框架,所有用Python写的的计算和控制逻辑都可以轻松接入;
- 跨平台,断依赖。VS 20xx redistributable再也不用装了,dll再也不会少了,ActiveX的坑也不会再遇到了;
- 附带了控制界面远程访问的功能,也许会有一些想不到的场景优势;
- 有js在前端,可以利用许多有趣的轮子和可视化框架。
但劣势在于:
- 作为本地应用,做一个Flask网站,显然对于部署来说是比较麻烦;
- 如果通过pyinstaller将网站打包,假设打包成功,将Flask完全做成了一个原生App,那么
- 功能所需的硬件连接会不会有问题;
- 软件所需的数据上下传,与本地环境会不会有问题;
整体结构:
- 整体框架: Flask
- 前端整体展示: HTML+CSS+js
- 可视化展示: matplot(替换原OpenCV库)+plotly(替换原ActiveX插件的折线图)
- 计算和流程控制逻辑: Python
- 硬件抽象: Python或C
- App打包: pyinstaller 1 2
其他选择:
- 为啥不用纯Python框架的dash
- dash将html代码混写在python代码里,对于debug和修改网页布局都略有不便,尤其是不方便在浏览器中做前端调试
- socketio的使用
- socketio是基于websocket的python包,用于实现websocket的数据传输方式。websocket可以达到C/S双向主动发起连接和推送数据,对于数据刷新的实时性有较好的提升。之前由于HTTP协议只能由C端发起请求,S端响应,因此如果前端展示想要刷新内容,只能使用定时器的方式(ajax的刷新就属于此类)。
- 分发形态为啥不使用docker
- docker的虚拟化,使得如果要在docker内部使用宿主机的硬件设备,需要在docker建立的profile中写好映射关系,使得docker容器内部的OS捕获宿主机的硬件资源。目前要开发的系统中,硬件资源接口各异,尤其是串口,可能无法实现自动映射。而且docker的体积有些太大了。
- 分发用electron怎样
- electron的后端逻辑是Node.js,想把基于Python的flask打进去实在是困难。
Comments