有讀者詢問:有沒有基於文本中終端的 GUI 開發框架?
今天筆者就帶大家,梳理幾個常見的基於文本終端的 UI 框架,一睹為快!
首先出場的是 Curses[1]。
Curse
Curses 是一個能提供基於文本終端窗口功能的動態庫,它可以:
創建和管理一個窗口
使用 8 種不同的彩色
為程序提供鼠標支持
使用鍵盤上的功能鍵 Curses 可以在任何遵循 ANSI/POSIX 標准的 Unix/Linux 系統上運行。Windows 上也可以運行,不過需要額外安裝 windows-curses
庫:
pip install windows-curses
上面圖片,就是一哥們用 Curses 寫的 俄羅斯方塊游戲[2],是不感覺滿滿的回憶吧,可以拿去復活古董機了。
我們也來試試牛刀:
import cursesmyscreen = 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 npyscreenclass 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()
pip install npyscreen
繼承 npyscreen.NPSApp
創建一個應用類 TestApp
實現 main
方法,方法裡創建一個 Form
表單對象,然後向表單對象上添加各種控件,並設置控件的一些屬性
調用表單對象的 Edit
方法,將操作權交給用戶
在運行時,實例化 TestAPP
,然後調用 run
方法啟動應用,應用即可進入等待用戶交互的狀態 上面代碼運行的效果如下:
Npyscreen
[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 結構圖
現在我們來小試一把,感受一下 Urwid 的強大:
import urwiddef 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]:
NetEase-MusicBox
是基於 Curses 開發,如果運行起來,能被它的強悍所震撼,有空可以玩玩,比心!
以上就是本次分享的所有內容,如果你覺得文章還不錯,歡迎關注公眾號: Python編程學習圈 ,每日干貨分享,發送“J”還可領取大量學習資料。或是前往編程學習網,了解更多編程技術知識。
作者:程序員小六
游戲編程,一個游戲開發收藏夾~
如果圖片長時間未顯示,請使用Chrome內核浏覽器。