當前位置: 妍妍網 > 碼農

泰酷辣!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.後台回復關鍵詞:名著

    ▲長按掃描關註,回復名著即可獲取