日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢(xún)
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
Python文本終端GUI框架,太酷了

Curses

Curse

Curses 是一個(gè)能提供基于文本終端窗口功能的動(dòng)態(tài)庫(kù),它可以:

  • 使用整個(gè)屏幕
  • 創(chuàng)建和管理一個(gè)窗口
  • 使用 8 種不同的彩色
  • 為程序提供鼠標(biāo)支持
  • 使用鍵盤(pán)上的功能鍵

Curses 可以在任何遵循 ANSI/POSIX 標(biāo)準(zhǔn)的 Unix/Linux 系統(tǒng)上運(yùn)行。Windows 上也可以運(yùn)行,不過(guò)需要額外安裝 windows-curses 庫(kù):

pip install windows-curses

上面圖片,就是一哥們用 Curses 寫(xiě)的 俄羅斯方塊游戲[2],是不感覺(jué)滿(mǎn)滿(mǎn)的回憶吧,可以拿去復(fù)活古董機(jī)了。

我們也來(lái)試試牛刀:

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ì)阻塞程序,直到等待鍵盤(pán)輸入
  • curses.endwin() 作用是退出窗口
  • 如果需要持續(xù)監(jiān)聽(tīng)用戶(hù)的交互,需要寫(xiě)個(gè)循環(huán),并對(duì) getch() 獲得的輸入進(jìn)行判斷

代碼運(yùn)行效果如下:

小試牛刀

Curses 非常輕巧,特別適合處理一下簡(jiǎn)單交互,代替復(fù)雜參數(shù)輸入的程序,既優(yōu)雅,有簡(jiǎn)單,而且 Curses 也是其他文字終端 UI 的基礎(chǔ)。

Npyscreen

Npyscreen[3] 也是一個(gè)用了編寫(xiě)文本終端的 Python 組件庫(kù),是基于 Curses 構(gòu)建的應(yīng)用框架。

比起 Curses,Npyscreen 更接近 UI 式編程,通過(guò)組件的組合完成 UI 展示和交互,而且 Npyscreen 可以自適應(yīng)屏幕變化。

Npyscreen 提供了多個(gè)控件,比如 表單(Form)、單行文本輸入框(TitleText)、日期控件(TitleDateCombo)、多行文本輸入框(MultiLineEdit)、單選列表(TitleSelectOne)、進(jìn)度條(TitleSlider)等多種控件。

提供強(qiáng)大的功能,滿(mǎn)足快速開(kāi)發(fā)程序的要求,無(wú)論是簡(jiǎn)單的單頁(yè)程序還是復(fù)雜的多頁(yè)應(yīng)用。

來(lái)看一個(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 模塊,如果沒(méi)有可以通過(guò) pip 安裝:pip install npyscreen
  • 繼承 npyscreen.NPSApp 創(chuàng)建一個(gè)應(yīng)用類(lèi) TestApp
  • 實(shí)現(xiàn) main 方法,方法里創(chuàng)建一個(gè) Form 表單對(duì)象,然后向表單對(duì)象上添加各種控件,并設(shè)置控件的一些屬性
  • 調(diào)用表單對(duì)象的 Edit 方法,將操作權(quán)交給用戶(hù)
  • 在運(yùn)行時(shí),實(shí)例化 TestAPP,然后調(diào)用 run 方法啟動(dòng)應(yīng)用,應(yīng)用即可進(jìn)入等待用戶(hù)交互的狀態(tài)

上面代碼運(yùn)行的效果如下:

Npyscreen

  •  [Tab] / [Shift + Tab] 用于切換控件焦點(diǎn)
  • [回車(chē)] / [空格] 用于進(jìn)入選擇、設(shè)置、確認(rèn)
  • 在選擇框架中,方向鍵與 vim[4] 操作類(lèi)似,即通過(guò) hjkl 來(lái)控制

是不是感覺(jué)很神奇,用文本原來(lái)可以做這么多復(fù)雜的操作,之前對(duì)命令行中的進(jìn)度顯示的疑惑是否有所清晰了~

Urwid

如果說(shuō) Curses 和 Npysreen 是輕量級(jí)的文本終端 UI 框架,那么 Urwid[5] 絕對(duì)稱(chēng)得上是重量級(jí)選手。

Urwid 包含了眾多開(kāi)發(fā)文本 UI 的特性,例如:

  • 應(yīng)用窗口自適應(yīng)
  • 文本自動(dòng)對(duì)齊
  • 輕松設(shè)置文本塊
  • 強(qiáng)大的選擇框控件
  • 可以和各種基于事件驅(qū)動(dòng)的框架集成,比如和 Twisted[6], Glib[7], Tornado[8] 等等
  • 提供諸如編輯框、按鈕、多(單)選框 等多種預(yù)制控件
  • 顯示模式支持原生、Curses模式、LCD 顯示屏 以及 網(wǎng)絡(luò)顯示器
  • 支持 UTF-8 以及 CJK 字符集(可以顯示中文)
  •  支持多種顏色

看看效果:

消息框

多字體

色彩

不知道你看了是什么感覺(jué),我的感覺(jué)是:這也太卷了吧~

幾乎可以做 GUI 下的所有事情!

更厲害的是,Urwid 完全是按照面向?qū)ο蟮乃枷氪蛟斓目蚣埽?/p>

Urwid 結(jié)構(gòu)圖

現(xiàn)在我們來(lái)小試一把,感受一下 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),否則將按鍵名稱(chēng)顯示出來(lái)
  • urwid.Text 是一個(gè)文本控件,接受一個(gè)字符串作為顯示信息
  • urwid.Filler 類(lèi)似于 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件無(wú)法運(yùn)行

總結(jié)

限于篇幅,這里只展示了三種文本終端框架,不過(guò)已經(jīng)能對(duì)基于文本終端 UI 框架的強(qiáng)大感受一二了。

還有一些框架也很優(yōu)秀,比如 prompt_toolkit,有興趣的同學(xué)可以研究一下。

雖然基于文本終端的 UI 早已不是主流,但是在一些特殊的行業(yè)或者業(yè)務(wù)中,還是有其存在的價(jià)值,研究一下,說(shuō)不定在特殊的地方可以幫助到我們。

最后,推薦一個(gè)很有意思的基于文本終端的應(yīng)用 —— 命令行網(wǎng)易云音樂(lè)[9]:

NetEase-MusicBox

是基于 Curses 開(kāi)發(fā),如果運(yùn)行起來(lái),能被它的強(qiáng)悍所震撼,有空可以玩玩,比心!


分享題目:Python文本終端GUI框架,太酷了
本文網(wǎng)址:http://m.5511xx.com/article/dpgsijs.html