12月02, 2019

番外:站稳了,我要吹 PySimpleGUI 了!

我的编程母语是 C 语言,说到编程语言鄙视链,你知道的吧,这是一个足以引起程序员世界大战的话题。

在很早之前,Python 也在我的鄙视链下游。Python、JS 之类被我统称为 “脚本”。这些年 Python 的易用性和丰富的第三资源深深的征服了我。但对 Python 我一直有一个遗憾,没有好用的 GUI 库。后来我发现了 PySimpleGUI,现在我终于可以说,

Python 除了生孩子,什么都可以!

传统 Python GUI 3 剑客

Python 的成功不仅仅因为功能强大的标准库,更离不开完善的生态,几乎你能想到的所有功能,Python 都有与之相应的第三方库可以使用。比如很多编程语言里最让人头疼的多线程问题,在 Python 中这样做:

import threading

my_thread = threading.Thread(target=my_thread_func)
my_thread.start()

非常简单清晰。用 Python 开发项目,你所需要的是定义好你需要做什么,然后找到合适的第三方库就可以很轻松搞定。

Python 可以做爬虫、处理数据、绘制绚丽的图表、发邮件等等。

人生苦短,我用 Python!

在知乎上,经常有人会问

  • “Python 可以做 GUI 吗?”
  • “Python 下 GUI 库推荐”

Python 程序员不满足于丑陋的黑框程序,也希望从蛮荒的黑框,进入现代化的视窗应用世界。

Python 下主流的 GUI 库有:

  • tkinter Python 下的标准 GUI 库。
  • pyQt 系列,QT 的 Python 版本,完整而庞大!
  • WxPython,轻量级的 GUI 库,wxWidgets 的 Python 版本。

其中 Qt 和 wxWidgets 都是老牌的 GUI 库,由 C++ 编写。pyQt 和 WxPython 是它们的 Python 封装版本,侧面也展示了 Python 与 C/C++ 无缝衔接的能力。

这三种库都可以写出接近系统原生 GUI 性能的应用。Qt 也是面向对象风格的库,但是它由 C++ 写的,要想驾驭 pyQt,你需要对原生 Qt 有相当的了解。恰巧 C++ 是最复杂的现代编程语言之一!至今没有人真的精通它,包括 C++ 的创造者!WxPython 也是同样的问题。 这对使用者提出了相当高的要求。

tkinter 倒是用一种 TCL 的脚本语言编写的。

这三种库都是对其他语言 GUI 库的封装,因此使用这 3 中库编程,非常明显的感受到来自 C++ 编程风格的影响,完全打破了 Pythonic,几乎是 Python 关键字的 C++ 代码。

这些问题将 Python 使用者们生生阻拦在 GUI 大门之外。我们期待一种像 Threading 库一样简单易用的 Python GUI 库!

PySimpleGUI

大概阅读了下作者的文档,这个库是 2018 年中才正式发布,属于相当年轻的 GUI 库。无意之间看到它的介绍,简单试用了下,它就是我要的那个 GUI 库了

对作者文档的一点感受 作者的文档写的是相当 “散文”,不像是经典的 doc 那样条条款款 1、2、3 列清楚,而是以唠家常的方式聊出来,算是工程师里的文艺青年了。不过话说回来,如果不是 Python 好用,哪有功夫在这儿说相声不是么! 有兴趣可以在这里阅读他的 “大作

先看一段 demo,你也会被征服的!

# official demo code
from PySimpleGUI import Window, Text, Button

layout = [  [Text('This is some text on the first row')],
            [Text('And text on second row'), Button('Our Button')]  ]

window = Window('Title of window', layout)      # make the window
stuff = window.read()
print(stuff)        # let's print the stuff that's returned

能大概看明白代码吧,运行一下看起来是这样!

title

PySimpleGUI 没有沿用 C++ 的 callback 风格,而是采用 Python 的 call 风格,直接创建窗口,从窗口读取用户的输入结果。

当点击 “Our Button” 按钮的时候,上面的例子会输出

(“Our Button”, {})

tuple 的第一项称为 event,实际上是组件的文本(也可以为组件设置一个 key,在我 PySimpleGUI 2.2 中讲到);第二项为一个字典,记录的是用户输入,这里 demo 没有用户输入,所以是空字典。如果你有 C++ 下 GUI 经验,你会明白 PySimpleGUI 是多么优雅、简单!

从此,Python 程序员也过上有 GUI 的日子了!

这里只简单感受一下它的强大即可。PySimpleGUI 实际上是对 3 剑客的再一次封装,它最终依然会调用 3 剑客之一作为后台显示 GUI。据作者声称,相较于直接使用 Tkinter 库,PySimple GUI 减少了 5 倍的代码。

PySimpleGUI 最棒的一点是用 Python 的 二维 list 定义界面的 layout,相当于将 GUI 画面抽象为二维表格形式。

一个 Window 接受 title 和 list 形式的 layout,就可以显示了。调用 window 对象的 read 方法,就能获得用户的输入。视窗彻底成为 Python 风格的对象。

为什么我认为 PySimpleGUI 是更好的 Python GUI 库

Python GUI 3 剑客向程序员暴露了非常细节的内容,方便程序员对 GUI 进行像素级控制,细致但对 Python 程序员非常不友好。

而 Python 程序员很多时候需要的只是一个快捷的 GUI,与用户完成简单的交互而已,3 剑客就有点过于细节,好比我只是想要一辆代步车,你却跟我解释内燃机 4 冲程,一点也不 Pythonic!

PySimpleGUI 在 3 剑客的基础上(实际上 PySimpleGUI 也支持 web 后端),进行二次封装,让 GUI 真正成为 Python 世界的公民,像一个 Python 对象一样被调用,基本上做到了开箱即用。

既然广告法不允许,只能说 PySimpleGUI 就是更好的 GUI 库了!

本文链接:http://www.thinkinpython.com/post/FW_flatter_PySimpleGUI.html

-- EOF --