需求背景
最近一天内接到两个 Windows 客户端的开发需求:
- 将 Android 上的农产品图像识别,移植到 Windows 系统上。使用客户端实现,而非网页。运行 pytorch yolov5 生成的模型
- 实现一个概率统计的 Windows 客户端,带本地数据库存储功能
虽然,最近忙得一塌糊涂,没有时间去动手实现,但是技术选型问题一直困扰着我,成为了我的心头大患。因为我自己也有很多小需求想用 GUI 客户端实现,苦于没有顺手的方案一直搁置中。
恰好,赶上去浙江出差,单程行车 9 个小时,给了我充足时间可以去纠结选项问题。
首先 pass 掉一切 js 相关跨平台的方案,没有为什么,就是单纯的厌恶。
Compose Multi Platform
优势:
- 因为已经有了 Android 版本,所以感觉用 Kotlin Compose 跨平台方案应该可行,可以共用部分代码
- 经过几个 Android 项目的历练,Kotlin 基本熟悉了,可以无障碍的写基本功能
劣势:
- 一想到要用 Android Studio / JB 家的怪兽级 IDE 开发就难受;
- Compose 语法令我厌恶;我还是觉得 XML 可读性更好
- Java 系客户端的耗内存也是恶心人的地方;
- 无法发挥 windows 系统接口的优势
WinForm / WPF
优势:
- 用 WPF 写过两个自用客户端,确实很方便。上手成本很低,Visual Studio 作为宇宙第一 IDE 不是白叫的
- Windows 原生技术开发,不用担心性能问题,打包问题。遇到坑也不怕,总能找到解决方案
- .NET Core 之后可以完全脱离 VS IDE 用 Terminal 命令行里开发,非常方便
- C# 的深度模型执行库很成熟
- 可以充分利用 Windows 的系统功能
劣势:
- C# 一直不是很熟悉,偶尔用,一直没有一个实际的大项目来巩固,导致一段时间不用,就完全忘光。
- WinForm 也好,WPF 也好,默认组件太丑陋了,没法作为商业级产品进行交付。倒是有不少三方库做了美化。但是要做到 Win11 的风格,看上去还是很难
- 这两个框架其实非常陌生,又是从头看文档的过程。也许可以通过 github 上找个类似脚手架开始
tkinter
突然想到是否可以尝试一下 Python 系的 GUI 方案,最近业余一直在写 Python。 我自己都很意外,本以为将 golang 做为主语言之后,就再也没有机会大规模写 Python 了。 没想到随着 AI 的兴起,无论是语言模型训练,还是图像识别,又再次用到了 Python,而且还是重度使用。
Python 语法真是很难忘掉,就像流淌在血液中一般,那为何不尝试一下 Python 的 GUI 方案呢?
对比了几个方案:
- tkinter,python 自带的 GUI 库,简单粗暴,挺方便,就是丑点。业余看了几本 tkinter 的书,感觉上手非常 easy
- pyqt / pyside 担心商业授权问题,暂不考虑
- flet,这个是去年开始出现的一个基于 flutter 组件的 GUI 框架,界面一下子漂亮了许多,而且还有可能支持全平台,及 golang / C# 等语言。我目前是很想尝试这个方案的
所有的 python GUI 方案,都面临着一个问题,就是打包问题。总不能发给客户一个 python 源码文件吧,肯定得打包成一个 exe 可执行文件。pyinstaller 打包出的单文件大小倒是可以接受,30M 以上,但是首次加载速度我真是忍不了,4 到 5 秒的启动速度,我感觉羞于给他人展示。还有其他的打包方案,看起来都不是很理想。特别是不确定打包时是否会引入恐怖的 pytorch 巨型依赖包。
我觉得,如果是开发自用工具的化,python tkinter / flet 都是不错的方案,但是如果是商业产品必须要解决启动速度问题。这个需要详细测试一下各种打包方案。
Golang GUI 方案
最近看到 Rust / Golang 都有不少基于 WebView2 的跨平台方案,有尝试的冲动。
但是唯一担心的是对深度学习模型支持不够,遇到坑没法填平。
- golang wails: https://wails.io/
结论
目前我最倾向于使用 C# 的 WinForm,次之是 Python 的 flet。
虽然大家都觉得 WinForm 是一项已经淘汰的技术,但是我觉得适合自己的才是好的技术。
微信关注我哦 👍
我是来自山东烟台的一名开发者,有感兴趣的话题,或者软件开发需求,欢迎加微信 zhongwei 聊聊, 查看更多联系方式