我和我的队友们希望启动一个涉及自定义图形用户界面(GUI)应用程序的Python代码库,该应用程序可以在内部轻松部署,甚至可以在外部分发给客户。我原以为这项任务在2020年会很琐碎,但我似乎在探索的每一条道路上都遇到了死胡同/重大问题。因此,在花了无数个小时进行研究和解决问题失败后,我决定总结我的目标并询问社区。我相信这个解决方案将使许多人受益。
注意:我寻求的不是"建议",而是已知的(基于经验的)符合以下具体要求的事实解决方案
目标
查找Python 3的GUI工具包解决方案,该解决方案具有以下要求:
-
许可证:免费,用于开发和轻度商业发行。
-
可移植性:可移植且易于在Windows 10上部署,也可在Mac OS X和Raspberry Pi上部署(可能还有一些移动实验)。
-
2D图形:它必须提供一种半实时呈现和更新2D图形的方法(例如每秒多次更新matplotlib FigureCanvas的数据)。
-
UI设计:可视化设计器应用程序必须可用于设计和更新GUI接口定义(在可由Python代码加载的文本文件中)。
-
UI样式:它必须提供一种简单的方式来完全重新设计视觉元素的样式,最好是以类似CSS的方式(如调整按钮、颜色、阴影的角半径或创建自定义主题)。
迄今为止探索的尝试
尝试1:tkinter.ttk(TCL/Tk引擎)
-
[OK]免费
-
[OK]已经是Python3分发的一部分
-
[OK]图CanvasTkAgg
-
[确定]pygubu设计器应用程序,以及pygubu。生成器加载程序。
-
[不确定]虽然ttk提供了一些颜色样式(ttk创建和使用自定义主题,Python Tkinter自定义主题)和预定义主题,但我还没有找到任何方法来重新设置控件的样式(即调整按钮的圆度和阴影)。请参见下文。
使用tkinter.ttk的样式问题
例如,我可以模仿'clam'ttk主题按钮的元素结构(创建与';clam';ttk主题相同的自定义ttk样式(按钮小部件特定)),但不能在python中复制按钮的实际外观/渲染(角圆度、梯度等)。
使用位图或在画布上绘制原始形状是不可接受的解决方案(圆形按钮tkinter-python)
编辑:通过检查一些漂亮的ttk主题的源代码,可以发现着色和圆形按钮效果都是使用位图执行的,这大大增加了样式的复杂性。顺便说一句,主题的TCL脚本实际上是在Python tkinter模块后面进行解释的。
尝试2:PyGOjbect(GTK 3发动机)
-
[OK]免费
-
[不确定]我没有找到在Windows 10上轻松部署的方法。请参见下文。
-
[OK]图CanvasGTK3Agg
-
[OK]Glade(设计器应用程序保存.gade XML文件)和Gtk.Builder(Python中的布局加载器)。
-
[OK]Gtk.CssProvider允许使用类似CSS的语法进行完全自定义。
PyGObject在Windows 10上的部署问题
- 我使用MSYS2成功地在Windows上安装了PyGObject(GTK3)(哪里可以下载预编译的GTK+3二进制文件或Windows安装程序?),但它在正常的conda/pip安装之外运行
- ">PyGObject生态系统在Windows上还没有商业化"(在带有MingW的Windows上推出PyGObject/GTK+应用程序)
- ">安装MSYS2"(如何在没有MSYS2的Windows上构建GTK+3程序?)
- 我还没有尝试过vcpkg,但我读到">GTK团队不维护或支持vcpkg包"(https://www.gtk.org/docs/installations/windows/#using-vcpkg包中的gtk)
尝试3:wxPython(wxWidgets引擎)
- [OK]免费
- [OK]标准Python多平台包
- [OK]图CanvasWxAgg
- [警告]类似wxGlade和wxGlue的东西可以工作,但没有被广泛采用/维护
- wxWidgets似乎专注于"原生"控件(Python-wxPython中的自定义样式)
尝试4:PySide2(Qt引擎)
-
[不正常]不免费。如果资金超过25万美元,Qt商业许可证为4万美元/开发者。
-
[OK]可以部署在Windows 10和许多其他平台上
-
[OK]图CanvasQTAgg
-
〔OK〕Qt Designer应用程序和Python QUiLoader
-
[OK]Qt样式表(QSS)
尝试5:Web渲染引擎
-
[OK]我可以探索许多使用web技术创建类似桌面的应用程序的免费选项,如REMI、PyWebView、eel、Flexx、Dash等。
-
[OK]这些选项通常是标准的Python包
-
[WARN]但是,更新matplotlib图通常需要刷新IMG源位图,这可能不是高刷新率的最佳选择
-
[WARN]我可能会使用标准的HTML/Web可视化设计器,但需要适应Python模块。
-
[OK]HTML输出将支持所有常见的CSS样式选项。
对web渲染引擎的关注
- 我对这个选项的探索还不够深入
- 也许matplotlib刷新问题可以通过诸如plot.ly之类的JS绘图替代方案来解决
- 但我觉得复杂性的增加远远超出了预期这是我唯一的选择吗
编辑:尝试6:Kivy
- [OK]免费(MIT许可证)
- [OK]标准Python多平台软件包,并使用buildozer创建应用程序包
- [确定]图CanvasKivyAgg(
pip install kivy-garden
,然后是garden install matplotlib
) - [不确定]kivy设计器已弃用,找不到其他选择
- [OK]kv lang样式定义
是否有任何优雅的解决方案来应对这一技术挑战,满足所有5项要求
感谢
如果#5是一个绝对要求,那么选择PyQt。然而,学习曲线是陡峭的,开发模型不是很舒服(无论你使用传统的Qt小工具(有没有Qt Designer)还是最近的面向触摸的QML)。
否则,放弃5号需求,使用wxGlade选择wxPython。你的生活会轻松很多。wxGlade甚至包含了matplotlib示例,让您开始学习。
我还没有见过一个桌面应用程序有一个定制的GUI,这是值得的。通常,这种定制的外观与混乱的使用是齐头并进的。