是否可以使用免费且可移植(Windows友好)的解决方案在Python3中完全自定义UI应用程序



我和我的队友们希望启动一个涉及自定义图形用户界面(GUI)应用程序的Python代码库,该应用程序可以在内部轻松部署,甚至可以在外部分发给客户。我原以为这项任务在2020年会很琐碎,但我似乎在探索的每一条道路上都遇到了死胡同/重大问题。因此,在花了无数个小时进行研究和解决问题失败后,我决定总结我的目标并询问社区。我相信这个解决方案将使许多人受益。

注意:我寻求的不是"建议",而是已知的(基于经验的)符合以下具体要求的事实解决方案

目标

查找Python 3GUI工具包解决方案,该解决方案具有以下要求

  1. 许可证:免费,用于开发和轻度商业发行。

  2. 可移植性:可移植且易于在Windows 10上部署,也可在Mac OS X和Raspberry Pi上部署(可能还有一些移动实验)。

  3. 2D图形:它必须提供一种半实时呈现和更新2D图形的方法(例如每秒多次更新matplotlib FigureCanvas的数据)。

  4. UI设计:可视化设计器应用程序必须可用于设计和更新GUI接口定义(在可由Python代码加载的文本文件中)。

  5. UI样式:它必须提供一种简单的方式来完全重新设计视觉元素的样式,最好是以类似CSS的方式(如调整按钮、颜色、阴影的角半径或创建自定义主题)。

迄今为止探索的尝试

尝试1:tkinter.ttk(TCL/Tk引擎)

  1. [OK]免费

  2. [OK]已经是Python3分发的一部分

  3. [OK]图CanvasTkAgg

  4. [确定]pygubu设计器应用程序,以及pygubu。生成器加载程序。

  5. [不确定]虽然ttk提供了一些颜色样式(ttk创建和使用自定义主题,Python Tkinter自定义主题)和预定义主题,但我还没有找到任何方法来重新设置控件的样式(即调整按钮的圆度和阴影)。请参见下文。

使用tkinter.ttk的样式问题

  • 例如,我可以模仿'clam'ttk主题按钮的元素结构(创建与';clam';ttk主题相同的自定义ttk样式(按钮小部件特定)),但不能在python中复制按钮的实际外观/渲染(角圆度、梯度等)。

  • 使用位图或在画布上绘制原始形状是不可接受的解决方案(圆形按钮tkinter-python)

  • 编辑:通过检查一些漂亮的ttk主题的源代码,可以发现着色和圆形按钮效果都是使用位图执行的,这大大增加了样式的复杂性。顺便说一句,主题的TCL脚本实际上是在Python tkinter模块后面进行解释的。

尝试2:PyGOjbect(GTK 3发动机)

  1. [OK]免费

  2. [不确定]我没有找到在Windows 10上轻松部署的方法。请参见下文。

  3. [OK]图CanvasGTK3Agg

  4. [OK]Glade(设计器应用程序保存.gade XML文件)和Gtk.Builder(Python中的布局加载器)。

  5. [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引擎)

  1. [OK]免费
  2. [OK]标准Python多平台包
  3. [OK]图CanvasWxAgg
  4. [警告]类似wxGlade和wxGlue的东西可以工作,但没有被广泛采用/维护
  5. wxWidgets似乎专注于"原生"控件(Python-wxPython中的自定义样式)

尝试4:PySide2(Qt引擎)

  1. [不正常]不免费。如果资金超过25万美元,Qt商业许可证为4万美元/开发者。

  2. [OK]可以部署在Windows 10和许多其他平台上

  3. [OK]图CanvasQTAgg

  4. 〔OK〕Qt Designer应用程序和Python QUiLoader

  5. [OK]Qt样式表(QSS)

尝试5:Web渲染引擎

  1. [OK]我可以探索许多使用web技术创建类似桌面的应用程序的免费选项,如REMI、PyWebView、eel、Flexx、Dash等。

  2. [OK]这些选项通常是标准的Python包

  3. [WARN]但是,更新matplotlib图通常需要刷新IMG源位图,这可能不是高刷新率的最佳选择

  4. [WARN]我可能会使用标准的HTML/Web可视化设计器,但需要适应Python模块。

  5. [OK]HTML输出将支持所有常见的CSS样式选项。

对web渲染引擎的关注

  • 我对这个选项的探索还不够深入
  • 也许matplotlib刷新问题可以通过诸如plot.ly之类的JS绘图替代方案来解决
  • 但我觉得复杂性的增加远远超出了预期这是我唯一的选择吗

编辑:尝试6:Kivy

  1. [OK]免费(MIT许可证)
  2. [OK]标准Python多平台软件包,并使用buildozer创建应用程序包
  3. [确定]图CanvasKivyAgg(pip install kivy-garden,然后是garden install matplotlib)
  4. [不确定]kivy设计器已弃用,找不到其他选择
  5. [OK]kv lang样式定义

是否有任何优雅的解决方案来应对这一技术挑战,满足所有5项要求

感谢

如果#5是一个绝对要求,那么选择PyQt。然而,学习曲线是陡峭的,开发模型不是很舒服(无论你使用传统的Qt小工具(有没有Qt Designer)还是最近的面向触摸的QML)。

否则,放弃5号需求,使用wxGlade选择wxPython。你的生活会轻松很多。wxGlade甚至包含了matplotlib示例,让您开始学习。

我还没有见过一个桌面应用程序有一个定制的GUI,这是值得的。通常,这种定制的外观与混乱的使用是齐头并进的。

相关内容

最新更新