掃二維碼與項目經(jīng)理溝通
我們在微信上24小時期待你的聲音
解答本文疑問/技術(shù)咨詢/運營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流
Curse

Curses 是一個能提供基于文本終端窗口功能的動態(tài)庫,它可以:
Curses 可以在任何遵循 ANSI/POSIX 標(biāo)準(zhǔn)的 Unix/Linux 系統(tǒng)上運行。Windows 上也可以運行,不過需要額外安裝 windows-curses 庫:
pip install windows-curses
上面圖片,就是一哥們用 Curses 寫的 俄羅斯方塊游戲[2],是不感覺滿滿的回憶吧,可以拿去復(fù)活古董機(jī)了。
我們也來試試牛刀:
import curses
myscreen = curses.initscr()
myscreen.border(0)
myscreen.addstr(12, 25, "Python curses in action!")
myscreen.refresh()
myscreen.getch()
curses.endwin()
代碼運行效果如下:
小試牛刀
Curses 非常輕巧,特別適合處理一下簡單交互,代替復(fù)雜參數(shù)輸入的程序,既優(yōu)雅,有簡單,而且 Curses 也是其他文字終端 UI 的基礎(chǔ)。
Npyscreen[3] 也是一個用了編寫文本終端的 Python 組件庫,是基于 Curses 構(gòu)建的應(yīng)用框架。
比起 Curses,Npyscreen 更接近 UI 式編程,通過組件的組合完成 UI 展示和交互,而且 Npyscreen 可以自適應(yīng)屏幕變化。
Npyscreen 提供了多個控件,比如 表單(Form)、單行文本輸入框(TitleText)、日期控件(TitleDateCombo)、多行文本輸入框(MultiLineEdit)、單選列表(TitleSelectOne)、進(jìn)度條(TitleSlider)等多種控件。
提供強大的功能,滿足快速開發(fā)程序的要求,無論是簡單的單頁程序還是復(fù)雜的多頁應(yīng)用。
來看一個小例子:
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
是不是感覺很神奇,用文本原來可以做這么多復(fù)雜的操作,之前對命令行中的進(jìn)度顯示的疑惑是否有所清晰了~
如果說 Curses 和 Npysreen 是輕量級的文本終端 UI 框架,那么 Urwid[5] 絕對稱得上是重量級選手。
Urwid 包含了眾多開發(fā)文本 UI 的特性,例如:
看看效果:
消息框
多字體
色彩
不知道你看了是什么感覺,我的感覺是:這也太卷了吧~
幾乎可以做 GUI 下的所有事情!
更厲害的是,Urwid 完全是按照面向?qū)ο蟮乃枷氪蛟斓目蚣埽?/p>
Urwid 結(jié)構(gòu)圖
現(xiàn)在我們來小試一把,感受一下 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()
運行這段代碼,就可以看到命令行被設(shè)置為交互模式,按鍵時會在窗口中央顯示出鍵名,如果按下 q 鍵,程序就會退出。
注意:
Urwid 只能在 Linux 操作系統(tǒng)中運行,Windows 上會因為缺失必要組件無法運行
限于篇幅,這里只展示了三種文本終端框架,不過已經(jīng)能對基于文本終端 UI 框架的強大感受一二了。
還有一些框架也很優(yōu)秀,比如 prompt_toolkit,有興趣的同學(xué)可以研究一下。
雖然基于文本終端的 UI 早已不是主流,但是在一些特殊的行業(yè)或者業(yè)務(wù)中,還是有其存在的價值,研究一下,說不定在特殊的地方可以幫助到我們。
最后,推薦一個很有意思的基于文本終端的應(yīng)用 —— 命令行網(wǎng)易云音樂[9]:
NetEase-MusicBox
是基于 Curses 開發(fā),如果運行起來,能被它的強悍所震撼,有空可以玩玩,比心!

我們在微信上24小時期待你的聲音
解答本文疑問/技術(shù)咨詢/運營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流