首頁  >  文章  >  後端開發  >  Python 文字終端 GUI 框架,太酷了

Python 文字終端 GUI 框架,太酷了

王林
王林轉載
2023-04-12 12:52:081291瀏覽

Curses

首先出場的是 Curses[1]。

Python 文字終端 GUI 框架,太酷了

Curse

Curses 是一個能提供基於文字終端機視窗功能的動態函式庫,它可以:

  • 使用整個螢幕
  • 建立並管理一個視窗
  • 使用8 種不同的彩色
  • # 為程式提供滑鼠支援
  • 使用鍵盤上的功能鍵

Curses 可以在任何遵循ANSI/POSIX 標準的Unix/Linux 系統上運作。 Windows 上也可以運行,不過需要額外安裝windows-curses 庫:

pip install windows-curses

上面圖片,就是一哥們用Curses 寫的俄羅斯方塊遊戲[2],是不感覺滿滿的回憶吧,可以拿去復活古董機了。

我們也來試試牛刀:

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() 獲得的輸入進行判斷

程式碼運作效果如下:

Python 文字終端 GUI 框架,太酷了

小試牛刀

Curses 非常輕巧,特別適合處理一下簡單交互,代替複雜參數輸入的程序,既優雅,有簡單,而且Curses 也是其他文字終端UI 的基礎。

Npyscreen

Npyscreen[3] 也是一個用了寫文字終端機的 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 方法啟動應用,應用即可進入等待使用者互動的狀態

上面程式碼運行的效果如下:

Python 文字終端 GUI 框架,太酷了

Npyscreen

  •  [Tab] / [Shift Tab] 用來切換控制焦點
  • [回車] / [空格] 用於進入選擇、設定、確認
  • 在選擇框架中,方向鍵與vim[4] 操作類似,即透過hjkl 來控制

是不是感覺很神奇,用文字原來可以做這麼多複雜的操作,之前對命令列中的進度顯示的疑惑是否有所清晰了~

Urwid

如果說Curses 和Npysreen 是輕量級的文字終端UI 框架,那麼Urwid[5] 絕對稱得上是重量級選手。

Urwid 包含了眾多開發文字UI 的特性,例如:

  • 應用程式視窗自適應
  • 文字自動對齊
  • 輕鬆設定文字區塊
  • 強大的選擇框控制項
  • 可以和各種基於事件驅動的框架集成,例如和Twisted[6], Glib[7], Tornado[8] 等等
  • 提供諸如編輯框、按鈕、多(單)選框等多種預製控制項
  • 顯示模式支援原生、Curses模式、LCD 顯示器以及網路顯示器
  • 支援UTF-8以及CJK 字元集(可以顯示中文)
  •  支援多種顏色

#看看效果:

Python 文字終端 GUI 框架,太酷了

訊息方塊

Python 文字終端 GUI 框架,太酷了

多元字體

Python 文字終端 GUI 框架,太酷了

色彩

不知道你看了是什么感觉,我的感觉是:这也太卷了吧~

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

更厉害的是,Urwid 完全是按照面向对象的思想打造的框架:

Python 文字終端 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 上会因为缺失必要组件无法运行

总结

限于篇幅,这里只展示了三种文本终端框架,不过已经能对基于文本终端 UI 框架的强大感受一二了。

还有一些框架也很优秀,比如 prompt_toolkit,有兴趣的同学可以研究一下。

虽然基于文本终端的 UI 早已不是主流,但是在一些特殊的行业或者业务中,还是有其存在的价值,研究一下,说不定在特殊的地方可以帮助到我们。

最后,推荐一个很有意思的基于文本终端的应用 —— 命令行网易云音乐[9]:

Python 文字終端 GUI 框架,太酷了

NetEase-MusicBox

是基于 Curses 开发,如果运行起来,能被它的强悍所震撼,有空可以玩玩,比心!

以上是Python 文字終端 GUI 框架,太酷了的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:51cto.com。如有侵權,請聯絡admin@php.cn刪除