当前位置: 欣欣网 > 码农

泰酷辣!Python文本终端GUI框架!

2024-03-28码农

点击上方 " Python人工智能技术 " 关注, 星标或者置顶

22点24分准时推送,第一时间送达

后台回复「 大礼包 」,送你特别福利

编辑:乐乐 | 来自:网络

上一篇:

正文

大家好,我是Python人工智能技术

今天梳理几个常见的基于文本终端的 UI 框架,一睹为快!

1

Curses


首先出场的是 Curses。

Curses 是一个能提供基于文本终端窗口功能的动态库,它可以:

  • 使用整个屏幕

  • 创建和管理一个窗口

  • 使用 8 种不同的彩色

  • 为程序提供鼠标支持

  • 使用键盘上的功能键

  • Curses 可以在任何遵循 ANSI/POSIX 标准的 Unix/Linux 系统上运行。Windows 上也可以运行,不过需要额外安装 windows-curses 库:

    pip install windows-curses

    上面图片,就是一哥们用 Curses 写的 俄罗斯方块游戏,是不感觉满满的回忆吧,可以拿去复活古董机了。

    我们也来试试牛刀:

    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

    2

    Npyscreen


    也是一个用了编写文本终端的 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 方法启动应用,应用即可进入等待用户交互的状态

  • 上面代码运行的效果如下:

  • [Tab] / [Shift + Tab] 用于切换控件焦点

  • [回车] / [空格] 用于进入选择、设置、确认

  • 在选择框架中,方向键与 vim[4] 操作类似,即通过 hjkl 来控制

  • 是不是感觉很神奇,用文本原来可以做这么多复杂的操作,之前对命令行中的进度显示的疑惑是否有所清晰了 ~

    3

    Ur wid


    如果说 Curses 和 Npysreen 是轻量级的文本终端 UI 框架,那么 Urwid 绝对称得上是重量级选手。

    Urwid 包含了众多开发文本 UI 的特性,例如:

  • 应用窗口自适应

  • 文本自动对齐

  • 轻松设置文本块

  • 强大的选择框控件

  • 可以和各种基于事件驱动的框架集成,比如和 Twisted, Glib, Tornado等等

  • 另外,搜索公众号Linux就该这样学后台回复「猴子」,获取一份惊喜礼包。

  • 提供诸如编辑框、按钮、多(单)选框 等多种预制控件

  • 显示模式支持原生、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 上会因为缺失必要组件无法运行

    4

    总结


    限于篇幅,这里只展示了三种文本终端框架,不过已经能对基于文本终端 UI 框架的强大感受一二了。

    还有一些框架也很优秀,比如 prompt_toolkit,有兴趣的同学可以研究一下。

    虽然基于文本终端的 UI 早已不是主流,但是在一些特殊的行业或者业务中,还是有其存在的价值,研究一下,说不定在特殊的地方可以帮助到我们。

    最后,推荐一个很有意思的基于文本终端的应用 —— 命令行网易云音乐:

    是基于 Curses 开发,如果运行起来,能被它的强悍所震撼,有空可以玩玩,比心!

    为了跟上AI时代我干了一件事儿,我创建了一个知识星球社群:ChartGPT与副业。想带着大家一起探索 ChatGPT和新的AI时代

    有很多小伙伴搞不定ChatGPT账号,于是我们决定,凡是这三天之内加入ChatPGT的小伙伴,我们直接送一个正常可用的永久ChatGPT独立账户。

    不光是增长速度最快,我们的星球品质也绝对经得起考验,短短一个月时间,我们的课程团队发布了 8个专栏、18个副业项目

    简单说下这个星球能给大家提供什么:

    1、不断分享如何使用ChatGPT来完成各种任务,让你更高效地使用ChatGPT,以及副业思考、变现思路、创业案例、落地案例分享。

    2、分享ChatGPT的使用方法、最新资讯、商业价值。

    3、探讨未来关于ChatGPT的机遇,共同成长。

    4、帮助大家解决ChatGPT遇到的问题。

    5、 提供一整年的售后服务,一起搞副业

    星球福利:

    1、加入星球4天后,就送ChatGPT独立账号。

    2、邀请你加入ChatGPT会员交流群。

    3、赠送一份完整的ChatGPT手册和66个ChatGPT副业赚钱手册。

    其它福利还在筹划中... 不过,我给你大家保证,加入星球后,收获的价值会远远大于今天加入的门票费用 !

    本星球第一期原价 399 ,目前属于试运营,早鸟价 169 ,每超过50人涨价10元,星球马上要来一波大的涨价,如果你还在犹豫,可能最后就要以 更高价格加入了 。。

    早就是优势。建议大家尽早以便宜的价格加入!

    欢迎有需要的同学试试,如果本文对您有帮助,也请帮忙点个 赞 + 在看 啦!❤️

    在 还有更多优质项目系统学习资源,欢迎分享给其他同学吧!

    你还有什 么想要补充的吗?

    免责声明:本文内容来源于网络,文章版权归原作者所有,意在传播相关技术知识&行业趋势,供大家学习交流,若涉及作品版权问题,请联系删除或授权事宜。

    技术君个人微信

    添加技术君个人微信即送一份惊喜大礼包

    → 技术资料共享

    → 技术交流社群

    --END--

    往日热文:

    Python程序员深度学习的「四大名著」:

    这四本书着实很不错!我们都知道现在机器学习、深度学习的资料太多了,面对海量资源,往往陷入到「无从下手」的困惑出境。而且并非所有的书籍都是优质资源,浪费大量的时间是得不偿失的。给大家推荐这几本好书并做简单介绍。

    获得方式:

    1.扫码关注本公众号

    2.后台回复关键词:名著

    ▲长按扫描关注,回复名著即可获取