时间:2022-10-09 17:55:05 | 浏览:1295
今天笔者带大家,梳理几个常见的基于文本终端的 UI 框架,一睹为快!
首先出场的是 Curses[1]。
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 的基础。
Npyscreen[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!
Mutiline text, press ^R to reformat.
""",
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
方法启动应用,应用即可进入等待用户交互的状态
上面代码运行的效果如下:
[Tab] / [Shift + Tab] 用于切换控件焦点
[回车] / [空格] 用于进入选择、设置、确认
在选择框架中,方向键与 vim[4] 操作类似,即通过 hjkl 来控制
是不是感觉很神奇,用文本原来可以做这么多复杂的操作,之前对命令行中的进度显示的疑惑是否有所清晰了~
如果说 Curses 和 Npysreen 是轻量级的文本终端 UI 框架,那么 Urwid[5] 绝对称得上是重量级选手。
Urwid 包含了众多开发文本 UI 的特性,例如:
应用窗口自适应
文本自动对齐
轻松设置文本块
强大的选择框控件
可以和各种基于事件驱动的框架集成,比如和 Twisted[6], Glib[7], Tornado[8] 等等
提供诸如编辑框、按钮、多(单)选框 等多种预制控件
显示模式支持原生、Curses模式、LCD 显示屏 以及 网络显示器
支持 UTF-8 以及 CJK 字符集(可以显示中文)
支持多种颜色
看看效果:
不知道你看了是什么感觉,我的感觉是:这也太卷了吧~
几乎可以做 GUI 下的所有事情!
更厉害的是,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(u"Hello 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]:
是基于 Curses 开发,如果运行起来,能被它的强悍所震撼,有空可以玩玩,比心!
[1]
Curses: https://docs.python.org/3/howto/curses.html
[2]
俄罗斯方块游戏:
https://github.com/cSquaerd/CursaTetra
[3]
npyscreen: https://npyscreen.readthedocs.io/
[4]
vim: https://www.vim.org/
[5]
Urwid: https://urwid.org/index.html
[6]
Twisted: https://www.twistedmatrix.com/trac/
[7]
Glib: https://docs.gtk.org/glib/
[8]
Tornado: https://www.tornadoweb.org/en/stable/
[9]
命令行网易云音乐 :
https://github.com/darknessomi/musicbox
卡贴机上车必看,最近大家关于卡贴机官解问的也是越来越少了,主要原因就是官解概率真的太小了,甚至卡贴机用户被官解这个事情,割了一波。关于卡贴机的运营商介绍,之前数码盖饭写过一期关于锁王的文章iPhone美版卡贴机运营商排名,如何鉴别锁王运营商。
我不喜欢一上来就推荐一堆参考资料的东西,那只会让初学者更迷茫。好比一个婴儿,你告诉他学会走路的方法有100种,他只会变的对走路毫无兴趣,他要的只是一种最有效的学会走路的办法,而不是100种。同样的,下面介绍的是我之前刚开始自己学习pytho
一、强类型和弱类型语言:C、 C++、 Java 、Python都是强类型的语言。PHP是弱类型的语言。强类型语言是一种强制类型定义的语言,即一旦某一个变量被定义类型,如果不经强制转换,那么它永远就是该数据类型。而弱类型语言是一种弱类型定义
PHP(超文本预处理器)锁定本词条由“科普中国”科学百科词条编写与应用工作项目 审核 。PHP即“超文本预处理器”,是一种通用开源脚本语言。PHP是在服务器端执行的脚本语言,与C语言类似,是常用的网站编程语言。PHP独特的语法混合了C、J
乾明 发自 凹非寺 量子位 报道 | 公众号 QbitAIPython势头不减,依旧第一,而且进一步拉开了与其他语言的差距。这一结果,来自IEEE Spectrum2019年度编程语言排行榜。这已经是Python连续3年保持第一。在Pyth
首先,我们先普及一下编程语言的基础知识。用任何编程语言来开发程序,都是为了让计算机干活,比如编写一篇文章,下载一首MP3等,而计算机干活的CPU只认识机器的指令,所以,尽管不同的编程语言差异极大,最后都得“翻译”成CPU可以执行的机器指令。
全球知名TIOBE 编程语言社区发布了11 月编程语言排行榜。下面让我们一起来看看,本月榜单中有哪些值得注意的新变化吧!01PHP即将跌出前十自 20 多年前 TIOBE 指数开始发布以来,PHP 一直常驻在榜单前十,然而最近,该语言已经开
【51CTO.com快译】在本文中,我们将逐一介绍目前人气较高的三种编程语言:PHP、Ruby和Python。我们将分析它们是如何工作的,它们彼此有何不同,谁在使用它们,以及每种语言受欢迎的程度。一、 PHP:互联网上最受欢迎的脚本语言PH
TIOBE 编程社区指数是编程语言流行程度的指标。该指数每月更新一次。评级基于全球熟练工程师、课程和第三方供应商的数量。谷歌、必应、雅虎、维基百科、亚马逊、YouTube 和百度等流行搜索引擎用于计算评分。需要注意的是,TIOBE 指数与最
IT行业现在依然是求职转行人群的首选,那么当下的IT培训机构中IT技术课程类目繁多,尤其是Java培训,PHP培训,Python培训以及前端培训最火,零基础人员如何选择一种适合自己的编程开发语言课程去学习入行呢?前三者属于后端的开发语言,我