curses首先出场的是 curses[1]。
curse
curses 是一个能提供基于文本终端窗口功能的动态库,它可以:
使用整个屏幕 创建和管理一个窗口 使用 8 种不同的彩色 为程序提供鼠标支持 使用键盘上的功能键curses 可以在任何遵循 ansi/posix 标准的 unix/linux 系统上运行。windows 上也可以运行,不过需要额外安装 windows-curses 库:
pip install windows-curses
上面图片,就是一哥们用 curses 写的 俄罗斯方块游戏[2],是不感觉满满的回忆吧,可以拿去复活古董机了。
我们也来试试牛刀:
import curses
myscreen = curses.initscr()
myscreen.border(0)
myscreen.addstr(12, 25, python curses in action!)
myscreen.refresh()
myscreen.getch()
curses.endwin()
需要注意 addstr 前两个参数是字符坐标,不是像素坐标 getch 会阻塞程序,直到等待键盘输入 curses.endwin() 作用是退出窗口 如果需要持续监听用户的交互,需要写个循环,并对 getch() 获得的输入进行判断代码运行效果如下:
小试牛刀
curses 非常轻巧,特别适合处理一下简单交互,代替复杂参数输入的程序,既优雅,有简单,而且 curses 也是其他文字终端 ui 的基础。
npyscreennpyscreen[3] 也是一个用了编写文本终端的 python 组件库,是基于 curses 构建的应用框架。
比起 curses,npyscreen 更接近 ui 式编程,通过组件的组合完成 ui 展示和交互,而且 npyscreen 可以自适应屏幕变化。
npyscreen 提供了多个控件,比如 表单(form)、单行文本输入框(titletext)、日期控件(titledatecombo)、多行文本输入框(multilineedit)、单选列表(titleselectone)、进度条(titleslider)等多种控件。
提供强大的功能,满足快速开发程序的要求,无论是简单的单页程序还是复杂的多页应用。
来看一个小例子:
import npyscreen
class testapp(npyscreen.npsapp):
def main(self):
# these lines create the form and populate it with widgets.
# a fairly complex screen in only 8 or so lines of code - a line for each control.
f= npyscreen.form(name = welcome to npyscreen,)
t= f.add(npyscreen.titletext, name = text:,)
fn = f.add(npyscreen.titlefilename, name = filename:)
fn2 = f.add(npyscreen.titlefilenamecombo, name=filename2:)
dt = f.add(npyscreen.titledatecombo, name = date:)
s= f.add(npyscreen.titleslider, out_of=12, name = slider)
ml = f.add(npyscreen.multilineedit,
value = try typing here!nmutiline text, press ^r to reformat.n,
max_height=5, rely=9)
ms = f.add(npyscreen.titleselectone, max_height=4, value = [1,], name=pick one,
values = [option1,option2,option3], scroll_exit=true)
ms2= f.add(npyscreen.titlemultiselect, max_height =-2, value = [1,], name=pick several,
values = [option1,option2,option3], scroll_exit=true)
# this lets the user interact with the form.
f.edit()
print(ms.get_selected_objects())
if __name__ == __main__:
app = testapp()
app.run()
引入 npyscreen 模块,如果没有可以通过 pip 安装:pip install npyscreen 继承 npyscreen.npsapp 创建一个应用类 testapp 实现 main 方法,方法里创建一个 form 表单对象,然后向表单对象上添加各种控件,并设置控件的一些属性 调用表单对象的 edit 方法,将操作权交给用户 在运行时,实例化 testapp,然后调用 run 方法启动应用,应用即可进入等待用户交互的状态上面代码运行的效果如下:
npyscreen
[tab] / [shift + tab] 用于切换控件焦点 [回车] / [空格] 用于进入选择、设置、确认 在选择框架中,方向键与 vim[4] 操作类似,即通过 hjkl 来控制是不是感觉很神奇,用文本原来可以做这么多复杂的操作,之前对命令行中的进度显示的疑惑是否有所清晰了~
urwid如果说 curses 和 npysreen 是轻量级的文本终端 ui 框架,那么 urwid[5] 绝对称得上是重量级选手。
urwid 包含了众多开发文本 ui 的特性,例如:
应用窗口自适应 文本自动对齐 轻松设置文本块 强大的选择框控件 可以和各种基于事件驱动的框架集成,比如和 twisted[6], glib[7], tornado[8] 等等 提供诸如编辑框、按钮、多(单)选框 等多种预制控件 显示模式支持原生、curses模式、lcd 显示屏 以及 网络显示器 支持 utf-8 以及 cjk 字符集(可以显示中文) 支持多种颜色看看效果:
消息框
多字体
色彩
不知道你看了是什么感觉,我的感觉是:这也太卷了吧~
几乎可以做 gui 下的所有事情!
更厉害的是,urwid 完全是按照面向对象的思想打造的框架:
urwid 结构图
现在我们来小试一把,感受一下 urwid 的强大:
import urwid
def show_or_exit(key):
if key in ('q', 'q'):
raise urwid.exitmainloop()
txt.set_text(repr(key))
txt = urwid.text(uhello world)
fill = urwid.filler(txt, 'middle')
loop = urwid.mainloop(fill, unhandled_input=show_or_exit)
loop.run()
先引入 urwid 模块 定义了一个输入事件处理方法 show_or_exit 处理方法中,当输入按键是 q 或者 q 时,退出主循环,否则将按键名称显示出来 urwid.text 是一个文本控件,接受一个字符串作为显示信息 urwid.filler 类似于 panel,将 txt 控件填充在上面,位置设置在窗口中央 urwid.mainloop 设置 urwid 的主循环,将 fill 作为控件的绘制入口,参数 unhandled_input 接受一个按键事件处理方法,用的就是前面定义的 show_or_exit loop.run() 启动 ui,并监控各种事件运行这段代码,就可以看到命令行被设置为交互模式,按键时会在窗口中央显示出键名,如果按下 q 键,程序就会退出。
注意:
urwid 只能在 linux 操作系统中运行,windows 上会因为缺失必要组件无法运行
总结限于篇幅,这里只展示了三种文本终端框架,不过已经能对基于文本终端 ui 框架的强大感受一二了。
还有一些框架也很优秀,比如 prompt_toolkit,有兴趣的同学可以研究一下。
虽然基于文本终端的 ui 早已不是主流,但是在一些特殊的行业或者业务中,还是有其存在的价值,研究一下,说不定在特殊的地方可以帮助到我们。
最后,推荐一个很有意思的基于文本终端的应用 —— 命令行网易云音乐[9]:
netease-musicbox
是基于 curses 开发,如果运行起来,能被它的强悍所震撼,有空可以玩玩,比心!
以上就是python 文本终端 gui 框架,太酷了的详细内容。