最近想写个命令行的图形界面的小玩具,类似htop,在命令行运行,但是不是那种输入-输出的模式,而是一种基于文字的图形界面,对于终端用户来说,比较友好。
我记得之前看到过一个不错的库,还跑过它的demo,费了不少劲才找到(你用就找不到不用就天天看到定律)。神奇的是,在这个过程中又发现不少类似的库…… 这下可纠结了。下面是整理的搜索过程中的资料,希望能帮到一些人。
1. curses
这是Python内置的一个module。不同的操作系统中不同的终端模拟器的行为可能是不一样的,curses就为你屏蔽了底层的细节,让你依赖curses写出的程序可以运行在各种终端上。也是基于这个目的,Python内置的curses基本上就是原生C curses的一个封装,实现了一些公共的操作,比如移动光标(cursor),滚动屏幕,擦除部分区域等。
另外,Windows上面的Python不会自带这个库,官方推荐了the Console module和UniCurses。
另另外,ncurses是curses的一个free版本。
我们如果想快速开发用户界面,一般会用到一些组件(widget),例如TextArea,Button,Form等,写过前端或安卓app等应该都很熟悉这些。这些东西curses都是没有提供的,并且如何响应事件等好像也是没有的,看过几个例子都是通过While True循环来监听事件。所以如果想写的界面稍微有点点复杂,这个库就力不从心了。Python的文档中推荐使用Urwid。
2. pyCDK
SourceForge的页面已经打不开了…… 我在pypi上看到上次更新是2003年…… 再见!
3. Urwid
这个就很厉害了,官方网站没有太多介绍,但是从requirements可以看出,是提供了事件循环的,并且是可选的:
- python-gi for GlibEventLoop (optional)
- Twisted for TwistedEventLoop (optional)
- Tornado for TornadoEventLoop (optional)
- asyncio or trollius for AsyncioEventLoop (optional)
这就很牛逼了。从文档中,可以看到有一些Widget Classes,常用的一些Widget都有的,很赞,还有一些例子,上手应该也挺简单。我觉得首选就是它了。它更像是一个framework,而不是一个widget的库。某些情况下还是有不方便的地方。我觉得应该可以再搞一个库,弄一些常用、方便用的widget。但是想来在命令行写UI的需求实在太小吧,估计没人去做了。
4. Blessings
这个库只是curses的一个pitch和封装,解决了部分curses不好的地方,比如说函数调用啰嗦等。可以让你用string的format来控制显示,然后封装了一个Terminal,用户只用这一个对象就可以。可以说只是修修补补,但是主要的问题没有解决(UI组件和事件驱动)。
作者有另一个东西挺有意思,一个终端的游戏conway,就是用自己的这个库写的。
curses这种库用来当做一个终端的pygame来用应该没啥问题的,每一帧都重新绘制(终端本来也没几个字符),并不需要什么widget,因为基本都是自己画的游戏图形,但是并不适合来制作UI。
参考: