Python文本終端GUI框架示例詳細(xì)講解
今天筆者帶大家,梳理幾個(gè)常見的基于文本終端的 UI 框架,一睹為快!
Curses
首先出場的是 Curses。
Curses 是一個(gè)能提供基于文本終端窗口功能的動(dòng)態(tài)庫,它可以:
- 使用整個(gè)屏幕
- 創(chuàng)建和管理一個(gè)窗口
- 使用 8 種不同的彩色
- 為程序提供鼠標(biāo)支持
- 使用鍵盤上的功能鍵
Curses 可以在任何遵循 ANSI/POSIX 標(biāo)準(zhǔn)的 Unix/Linux 系統(tǒng)上運(yùn)行。Windows 上也可以運(yùn)行,不過需要額外安裝 windows-curses 庫:
pip install windows-curses
上面圖片,就是一哥們用 Curses 寫的 俄羅斯方塊游戲,是不感覺滿滿的回憶吧,可以拿去復(fù)活古董機(jī)了。
我們也來試試牛刀:
import curses myscreen = curses.initscr() myscreen.border(0) myscreen.addstr(12, 25, "Python curses in action!") myscreen.refresh() myscreen.getch() curses.endwin()
- 需要注意 addstr 前兩個(gè)參數(shù)是字符坐標(biāo),不是像素坐標(biāo)
- getch 會(huì)阻塞程序,直到等待鍵盤輸入
- curses.endwin() 作用是退出窗口
- 如果需要持續(xù)監(jiān)聽用戶的交互,需要寫個(gè)循環(huán),并對 getch() 獲得的輸入進(jìn)行判斷
代碼運(yùn)行效果如下:
Curses 非常輕巧,特別適合處理一下簡單交互,代替復(fù)雜參數(shù)輸入的程序,既優(yōu)雅,有簡單,而且 Curses 也是其他文字終端 UI 的基礎(chǔ)。Npyscreen
Npyscreen
也是一個(gè)用了編寫文本終端的 Python 組件庫,是基于 Curses 構(gòu)建的應(yīng)用框架。
比起 Curses,Npyscreen 更接近 UI 式編程,通過組件的組合完成 UI 展示和交互,而且 Npyscreen 可以自適應(yīng)屏幕變化。
Npyscreen 提供了多個(gè)控件,比如 表單(Form)、單行文本輸入框(TitleText)、日期控件(TitleDateCombo)、多行文本輸入框(MultiLineEdit)、單選列表(TitleSelectOne)、進(jìn)度條(TitleSlider)等多種控件。
提供強(qiáng)大的功能,滿足快速開發(fā)程序的要求,無論是簡單的單頁程序還是復(fù)雜的多頁應(yīng)用。
來看一個(gè)小例子:
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 創(chuàng)建一個(gè)應(yīng)用類 TestApp
- 實(shí)現(xiàn) main 方法,方法里創(chuàng)建一個(gè) Form 表單對象,然后向表單對象上添加各種控件,并設(shè)置控件的一些屬性
- 調(diào)用表單對象的 Edit 方法,將操作權(quán)交給用戶
- 在運(yùn)行時(shí),實(shí)例化 TestAPP,然后調(diào)用 run 方法啟動(dòng)應(yīng)用,應(yīng)用即可進(jìn)入等待用戶交互的狀態(tài)
上面代碼運(yùn)行的效果如下:
- [Tab] / [Shift + Tab] 用于切換控件焦點(diǎn)
- [回車] / [空格] 用于進(jìn)入選擇、設(shè)置、確認(rèn)
- 在選擇框架中,方向鍵與 vim[4] 操作類似,即通過 hjkl 來控制
是不是感覺很神奇,用文本原來可以做這么多復(fù)雜的操作,之前對命令行中的進(jìn)度顯示的疑惑是否有所清晰了 ~
Urwid
如果說 Curses 和 Npysreen 是輕量級的文本終端 UI 框架,那么 Urwid 絕對稱得上是重量級選手。
Urwid 包含了眾多開發(fā)文本 UI 的特性,例如:
- 應(yīng)用窗口自適應(yīng)
- 文本自動(dòng)對齊
- 輕松設(shè)置文本塊
- 強(qiáng)大的選擇框控件
- 可以和各種基于事件驅(qū)動(dòng)的框架集成,比如和 Twisted, Glib, Tornado等等
- 提供諸如編輯框、按鈕、多(單)選框 等多種預(yù)制控件
- 顯示模式支持原生、Curses模式、LCD 顯示屏 以及 網(wǎng)絡(luò)顯示器
- 支持 UTF-8 以及 CJK 字符集(可以顯示中文)
- 支持多種顏色
看看效果:
不知道你看了是什么感覺,我的感覺是:這也太卷了吧~
幾乎可以做 GUI 下的所有事情!
更厲害的是,Urwid 完全是按照面向?qū)ο蟮乃枷氪蛟斓目蚣埽?/p>
現(xiàn)在我們來小試一把,感受一下 Urwid 的強(qiáng)大:
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 模塊
- 定義了一個(gè)輸入事件處理方法 show_or_exit
- 處理方法中,當(dāng)輸入按鍵是 q 或者 Q 時(shí),退出主循環(huán),否則將按鍵名稱顯示出來
- urwid.Text 是一個(gè)文本控件,接受一個(gè)字符串作為顯示信息
- urwid.Filler 類似于 panel,將 txt 控件填充在上面,位置設(shè)置在窗口中央
- urwid.MainLoop 設(shè)置 Urwid 的主循環(huán),將 fill 作為控件的繪制入口,參數(shù) unhandled_input 接受一個(gè)按鍵事件處理方法,用的就是前面定義的 show_or_exit
- loop.run() 啟動(dòng) UI,并監(jiān)控各種事件
運(yùn)行這段代碼,就可以看到命令行被設(shè)置為交互模式,按鍵時(shí)會(huì)在窗口中央顯示出鍵名,如果按下 q 鍵,程序就會(huì)退出。
注意:Urwid 只能在 Linux 操作系統(tǒng)中運(yùn)行,Windows 上會(huì)因?yàn)槿笔П匾M件無法運(yùn)行
總結(jié)
限于篇幅,這里只展示了三種文本終端框架,不過已經(jīng)能對基于文本終端 UI 框架的強(qiáng)大感受一二了。
還有一些框架也很優(yōu)秀,比如 prompt_toolkit,有興趣的同學(xué)可以研究一下。
雖然基于文本終端的 UI 早已不是主流,但是在一些特殊的行業(yè)或者業(yè)務(wù)中,還是有其存在的價(jià)值,研究一下,說不定在特殊的地方可以幫助到我們。
最后,推薦一個(gè)很有意思的基于文本終端的應(yīng)用 —— 命令行網(wǎng)易云音樂:
是基于 Curses 開發(fā),如果運(yùn)行起來,能被它的強(qiáng)悍所震撼,有空可以玩玩,比心!
到此這篇關(guān)于Python文本終端GUI框架示例詳細(xì)講解的文章就介紹到這了,更多相關(guān)Python文本終端GUI框架內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python無法安裝包的一種解決(Requirement already satisfied問題)
這篇文章主要介紹了Python無法安裝包的一種解決(Requirement already satisfied問題),具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-08-08Python機(jī)器學(xué)習(xí)NLP自然語言處理Word2vec電影影評建模
本文是Python機(jī)器學(xué)習(xí)NLP自然語言處理系列文章,帶大家開啟一段學(xué)習(xí)自然語言處理 (NLP) 的旅程. 本篇文章主要學(xué)習(xí)NLP自然語言處理基本操作Word2vec電影影評建模2021-09-09深入理解python?生成器、迭代器、動(dòng)態(tài)新增屬性及方法
這篇文章主要介紹了python?生成器、迭代器、動(dòng)態(tài)新增屬性及方法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-04-04查找python項(xiàng)目依賴并生成requirements.txt的方法
今天小編就為大家分享一篇查找python項(xiàng)目依賴并生成requirements.txt的方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-07-07Python的Django框架中設(shè)置日期和字段可選的方法
這篇文章主要介紹了Python的Django框架中設(shè)置日期和字段可選的方法,是Django設(shè)置當(dāng)中的基本操作,需要的朋友可以參考下2015-07-07Python Pygame實(shí)戰(zhàn)之飛機(jī)大戰(zhàn)的實(shí)現(xiàn)
飛機(jī)大戰(zhàn)想必是很多人童年時(shí)期的經(jīng)典游戲,這篇文章主要給大家介紹了關(guān)于如何利用python中的Pygame模塊寫一個(gè)簡單的飛機(jī)大戰(zhàn)小游戲的相關(guān)資料,需要的朋友可以參考下2022-03-03