首先出場的是 Curses[1]。
Curse
Curses 是一個能提供基於文字終端機視窗功能的動態函式庫,它可以:
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()
程式碼運作效果如下:
小試牛刀
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!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
是不是感覺很神奇,用文字原來可以做這麼多複雜的操作,之前對命令列中的進度顯示的疑惑是否有所清晰了~
如果說Curses 和Npysreen 是輕量級的文字終端UI 框架,那麼Urwid[5] 絕對稱得上是重量級選手。
Urwid 包含了眾多開發文字UI 的特性,例如:
#看看效果:
訊息方塊
多元字體
色彩
不知道你看了是什么感觉,我的感觉是:这也太卷了吧~
几乎可以做 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(u"Hello World") fill = urwid.Filler(txt, 'middle') loop = urwid.MainLoop(fill, unhandled_input=show_or_exit) loop.run()
运行这段代码,就可以看到命令行被设置为交互模式,按键时会在窗口中央显示出键名,如果按下 q 键,程序就会退出。
注意:
Urwid 只能在 Linux 操作系统中运行,Windows 上会因为缺失必要组件无法运行
限于篇幅,这里只展示了三种文本终端框架,不过已经能对基于文本终端 UI 框架的强大感受一二了。
还有一些框架也很优秀,比如 prompt_toolkit,有兴趣的同学可以研究一下。
虽然基于文本终端的 UI 早已不是主流,但是在一些特殊的行业或者业务中,还是有其存在的价值,研究一下,说不定在特殊的地方可以帮助到我们。
最后,推荐一个很有意思的基于文本终端的应用 —— 命令行网易云音乐[9]:
NetEase-MusicBox
是基于 Curses 开发,如果运行起来,能被它的强悍所震撼,有空可以玩玩,比心!
以上是Python 文字終端 GUI 框架,太酷了的詳細內容。更多資訊請關注PHP中文網其他相關文章!