稀有猿诉

十年磨一剑,历炼出锋芒,说话千百句,不如码二行。

Python GUI Made Easy

大Python是很好用的一门编程语言,默认情况下我们都当成脚本来使用,都是通过命令行方式来运行我们写的程序。但有些时候GUI还是很方便使用的,脚本和命令行最适合的场景是批量任务运行和自动化,但是如果交互性质的任务较多时,脚本就特别不方便,这个时候GUI就相当的方便。因此,学习一下GUI相关方面的框架,还是相当有必要的。

GUI也即是图形用户界面,是用一些窗口小部件(widgets或者叫做views)如按扭,标签,列表,文本输入框等视觉元素组成的直观的,方便用户操作的软件使用界面。大Python是一个跨平台的通用编程语言,它本身是没有GUI框架的,语言本身以及核心库都不涉及GUI,所以,要想实现GUI,一个最为容易的方式就是对现有的GUI平台进行封装,也即是套壳。

流行的跨平台GUI平台

说到GUI,主流的操作系统平台都有自己的GUI框架,比如Windows的.NET以及水果Mac上面的Cocoa,再如Java的Swing和JavaFX。这些都是平台本身提供的能开发GUI的框架。

此外,还有一些非常流行的三方GUI,并且这些GUI都是跨平台的,如wxWidget,Tcl/Tk,QT和GTK+,这几个是非常流行的跨平台的GUI框架,起初这些平台都是源于C/C++语言的,因为桌面软件大多是用C/C++的,并且这两个语言本身也没有GUI库。

GUI平台重点在于其GUI开发能力,至于其支持的编程语言并不是问题,因为把它们用其他编程语言封装一下就能提供对其他语言支持了,像这些平台现在已经支持很多种编程语言了。

wxWidgets

wxWidgets是用C++实现的,最初也是用于C++的一个跨平台的GUI框架,也就 说用一套代码就可以在不同的平台(Windows, Linux和Mac OS)上创建GUI应用程序。后来也发展出来了对其他编程语言的支持,如Python。它最大的优势是接近平台本身的原生风格,就是说并没有进行过度的包装。

Tcl/Tk

Tcl/Tk是起源于Linux的一个脚本式的GUI编程语言,不用安装基本上都带了,最大问在于特别丑,而且比较难用,它的思维跟很多通用的编程语言是不一致的。

QT

QT是很强大的平台,不仅仅是用于GUI,当然最初也为了C++设计的GUI库。是KDE桌面的核心库。

GTK+

GTK+是起源于Linux的强大的GUI平台,最初是为了给C语言提供的GUI库。是Gnome桌面的核心库。

Python的封装式GUI框架

这些是GUI框架的核心实现,它们都支持多语言和跨平台。所以,很多Python的GUI框架都是基于上面这些的,有些是简单的封装,有些做了再次封装,但是核心实现仍是上述这些的库,在安装框架时都是需要先安装上述核心框架后才可以使用。 现在流行的Python的3方GUI框架也多是基于流行的3方的跨平台,跨语言的GUI框架,它们也是跨语言的,就是说针对 不同的编程语言都包了一层皮。

基于wxWidgets的

WxPython

WxPython可以说是wxWidgets提供给Python的官方库,它的优势是没有对wxWidgets进行过度的封装,使用起来就跟使用wxWidgets是一样的,如果有过wxWidgets的经验,那么上手wxPython会非常的快速。缺点是API相对low level,因为它就是把wxWidgets进行简单的封装和转化,并未进行层次更高的抽象和封装。

Wax

Wax是对wxPython的二次封装,是个二道贩子,优势是组件化更强,更好用,更方便搭建应用程序,会让wxPython更为好用一些。但是底层GUI实现仍是wxWidgets.

基于Tcl/Tk

就是Tkinker了。它最大的优势就是它是随着Python一起发布的,它是官方的,默认的GUI框架,不用再折腾安装。但是相对来说不是很好用,而且很丑。

基于QT

PyQT

PyQt这是QT对Python的官方支持,如果已有QT经验的人,用起来会相当的顺手。不好的地方在于API生硬,基本就是QT的原生API。

PySide

PySide是另外一个QT针对 Python的封装。 基于QT的最大的问题在于QT本身是收费的,虽然有免费的社区版本,但功能不如收费版本。

pyforms

pyforms这个库也是基于QT,它最大的优势是在于form这个词,所以它更适合于网站样式的GUI。缺点是文档等资源比较少。官方网站也相当简陋。

基于GTK+

PyGTK

PyGTK是GTK对Python的封装,如果有GTK经验会上手比较快,缺点跟PyQT或者wxPython是一样的,就是它只是GTK框架接口的一个简单封装,不够Pythonic,用起来可能也不是那么顺手,如果 没有GTK经验的话。

PyGUI

PyGUI这个库实现比较优雅,符合Pythonic精神。但它依赖于pyGtk,其实也是一个二道贩子。比较小众,文档教程之类的不够强大。

高层次的抽象封装

还有一些GUI框架,是更高层次的抽象封装,它底层的实现并没有指定哪个GUI框架,它们更注重于GUI组件本身,开发体验和GUI的使用体验,用起来更舒畅,而不用管底层的GUI框架实现。

PySimpleGUI

PySimpleGUI目的是高级的封装,让使用者完全不用理会具体的GUI框架。但是使用起来比较麻烦,虽然说它封装的更好,但是实装时要把各种GUI框架全装上。它最大的优势就是能与各种框架高度集成,比如能与给图框架matplotlib高度集成,或者与计算机视觉OpenCV高度集成,不需要做太多额外的事情。

如何选择

现在人都会有选择困难证,因为可供选择确实太多,对于开发领域更是如此,每一个功能需求都有大量的框架可供选择。

  • 把tkinker过滤掉,太丑太难用。
  • QT系列的也要过滤掉,因为非常讨厌QT。
  • 太原始的封装也要过滤掉,如PyGTK和wxPython,因这些API过于生硬,仅是对核心GUI框架的简单映射封装。
  • wxWidgets的也要过滤掉,因为讨厌C++。
  • pyforms也过滤掉,这东西太接近网页了。

剩下的只有PySimpleGUI和PyGUI再做一下PK吧。

PyGUI再pass掉,因为它的文档等看起来较简单,暂不考虑。

接下就只剩下PySimpleGUI

PySimpleGUI

通过进一步的看文档和资料,可以发现它的语句过于Python化,完全没有面向对象的概念(GUI框架是强OO的,有对象才更方便操作),可能易于上手,但跟大多的GUI框架明显差异过大,语法和语句过于奇怪。比如为何用widnow.read(),这个怪怪的,不应该封装一下嘛?

它看起来也很不错,不过,不想先尝试它,作为备选方案吧。

集大成者

除了针对三方GUI平台的封装外,还有一些GUI框架是基于更底层的graphics,从头搭建的GUI能力,比如Kivy和PyGame。

PyGame

主要面向游戏开发,并不适用于一般性的GUI开发,所以暂时忽略。

Kivy

就只剩下Kivy了,决定先尝试一下Kivy,起码这个名字听起来更酷一些。重点介绍一下,Kivy一个非常与众不同的Python GUI框架,起码跟上面那一坨封装都不一样。

Kivy是一个基于OpenGL的从零搭建GUI框架,GUI是一坨用户操作元素的组合,比如按扭文本框,输入框,文字标签,动态列表等等,它与graphics是无关的,是抽象层次更高的组件;而OpenGL是graphics库,它是专门用于画几何图形的,如点,线,面体等。通常情况下graphics是GUI的更底层能力,GUI是基于某个graphics库搭建而成的。所以Kivy是一个从零搭建的GUI框架,底层graphics是基于OpenGL,它的技术栈层位置与wxWidget/QT/GTK+是处于同一层的。所以,它跟那些封装层的库是完全不一样的东西。

Kivy是跨平台的,开发语言是Python,但是能为不同的平台构建应用程序,与所有的上面的相比,它的优势是不但可生成Desktop应用,也可以为移动平台(安卓和水果)和树莓派构建应用程序。另外一个巨大的优势是它是基于OpenGL实现的,因此可以用上GPU来加速渲染,渲染性能较高,而且会在图形方面和游戏方面有天生的优势,它本身是基于OpenGL的,所以可以直接用OpenGL API进行图形和游戏开发,不用再额外引入依赖。

从文档来看,这东西较适合游戏开发,而且它又是基于OpenGL的,可以用GPU加速,擅长于此。不过不重要,它是目前看起来最好的,先用它吧。还有一个非常大的优点就是,它做的很彻底,代码逻辑是用Python的,但是布局是用一套自定义的规则语言Kv来实现的,这就实现了代码逻辑与布局的分享,与大多数GUI框架的思想是一致的。

参考资料

Comments