欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

簡單的Python的curses庫使用教程

 更新時間:2015年04月11日 16:49:54   投稿:goldensun  
這篇文章主要介紹了簡單的Python的curses庫使用教程,來自IBM官方開發(fā)者技術文檔,需要的朋友可以參考下

curses 庫 ( ncurses ) 提供了控制字符屏幕的獨立于終端的方法。curses 是大多數(shù)類似于 UNIX 的系統(tǒng)(包括 Linux)的標準部分,而且它已經(jīng)移植到 Windows 和其它系統(tǒng)。curses 程序?qū)⒃诩兾谋鞠到y(tǒng)上、xterm 和其它窗口化控制臺會話中運行,這使這些應用程序具有良好的可移植性。
介紹 curses

Python 的標準 curses 提供了“玻璃電傳”(glass teletype)(在 20 世紀 70 年代,原始 curses 庫剛創(chuàng)建時,它叫做 CRT)的公共特性的基本接口。有許多方法可以讓用 Python 編寫的交互式文本模式程序變得更巧妙。這些方法分成兩類。

一方面,有些Python 模塊支持 ncurses (curses 的超集)或 slang (相似卻獨立的控制臺庫)的全部功能集合。最值得注意的是,這當中有一個增強庫(由適當?shù)?Python 模塊封裝)可以讓您將顏色添加到界面上。

另一方面,許多構建在curses(或 ncurses / slang )上的高級窗口小部件庫添加了諸如按鈕、菜單、滾動欄和各種公共界面設備之類的特性。如果您看到過用諸如 Borland's TurboWindows(DOS 版)之類的庫開發(fā)的應用程序,您就知道在文本模式控制臺中,這些特性是多么吸引人。窗口小部件庫中的功能單單使用 curses 都可以達到,但是還可以利用其它程序員在高級界面上取得的成果。請參閱 參考資料,以尋找所提到的模塊的鏈接。

本文只涉及 curses 自身的特性。由于 curses 模塊是標準發(fā)行版的一部分,您不必下載支持庫或其它 Python 模塊就可以找到并使用它(至少在 Linux 或 UNIX 系統(tǒng)中是這樣)。理解 curses 提供的基本支持很有用,即使只是作為理解高級模塊的基礎。即使不使用其它模塊,單獨使用 curses 構建漂亮且實用的 Python 文本模式應用程序也很簡單。預先發(fā)行的說明提到 Python 2.0 將包括 curses 的增強版本,但不管怎樣,它應該兼容此處說明的版本。

應用程序

我將討論為 Txt2Html(在 “可愛的 Python:我的第一個基于 Web 的過濾代理” 中介紹的文本到 HTML 轉(zhuǎn)換程序)編寫的封裝器,作為本文的測試應用程序。Txt2Html 有幾種運行方式。但為了與本文的目的保持一致,我們將研究從命令行運行的 Txt2Html。操作 Txt2Html 的一種方式是向它提供一組命令行變量(它們說明要執(zhí)行的轉(zhuǎn)換的各方面),然后將應用程序當作批處理運行。對于偶爾使用的用戶,一個更友好的用戶界面提供了一個交互式選擇屏幕,它可以在執(zhí)行實際轉(zhuǎn)換之前,引導用戶遍歷轉(zhuǎn)換選項(提供選中選項的視覺反饋)。

curses_txt2html 的界面基于常見的頂欄菜單,它帶有下拉和嵌套子菜單。所有菜單相關的功能都在 curses 上“從頭”開始設計。雖然這些菜單缺少更復雜的 curses 封裝器的一些特性,但它們的基本功能是由幾行只使用 curses 的代碼實現(xiàn)的。這個界面還帶有一個簡單的卷動幫助框和幾個用戶輸入字段。以下是顯示常規(guī)布局和樣式的應用程序的屏幕快照。
X終端上的應用程序

2015411164836286.gif (486×262)

Linux終端上的應用程序

2015411164913129.gif (667×430)

封裝 curses 應用程序

curses 編程的基本元素是窗口對象。窗口是帶有一個可尋址光標的實際物理屏幕的區(qū)域,光標的坐標與窗口相關??梢缘教幰苿哟翱?,并且可以創(chuàng)建和刪除窗口而不影響其它窗口。在窗口對象中,輸入或輸出操作發(fā)生在光標上,這通常由輸入或輸出方法明確設置,但也可以分別修改。

在初始化 curses 之后,可以用各種方式修改或完全禁用面向流的控制臺輸入和輸出。這基本上就是使用 curses 的全部重點。可是一旦更改了流式控制臺交互,如果程序出錯,將不會以正常方式顯示 Python 追溯事件。Andrew Kuchling 使用一個很好的 curses 程序頂級框架解決了這個問題(請參閱 參考資料中他的教程)。

以下模板(基本上與 Kuchling 的相同)保留在正常命令行 Python 的錯誤報告功能:
Python [curses] 程序的頂層設置代碼

import
   curses, traceback
  if
   __name__==
  '__main__':
  try
  :
 
  # Initialize curses
 stdscr=curses.initscr()
 
  # Turn off echoing of keys, and enter cbreak mode,
   # where no buffering is performed on keyboard input
 curses.noecho()
 curses.cbreak()
 
  # In keypad mode, escape sequences for special keys
   # (like the cursor keys) will be interpreted and
   # a special value like curses.KEY_LEFT will be returned
 stdscr.keypad(1)
 main(stdscr) 
  # Enter the main loop
   # Set everything back to normal
 stdscr.keypad(0)
 curses.echo()
 curses.nocbreak()
 curses.endwin() 
  # Terminate curses
  
except
  :
 
  # In event of error, restore terminal to sane state.
 stdscr.keypad(0)
 curses.echo()
 curses.nocbreak()
 curses.endwin()
 traceback.print_exc() 
  # Print the exception

try 代碼塊執(zhí)行一些初始化,調(diào)用 main() 函數(shù)來執(zhí)行實際工作,然后執(zhí)行最后的清除。如果出錯, except 代碼塊會將控制臺恢復成缺省狀態(tài),然后報告遇到的異常。

main() 事件循環(huán)

現(xiàn)在,我們研究 main() 函數(shù),看看 curses_txt2html 做些什么:
curses_txt2html.py main() 函數(shù)和事件循環(huán)

defmain
  (stdscr):
  # Frame the interface area at fixed VT100 size
  
global
   screen
 screen = stdscr.subwin(23, 79, 0, 0)
 screen.box()
 screen.hline(2, 1, curses.ACS_HLINE, 77)
 screen.refresh()
  # Define the topbar menus
 file_menu = (
  "File",
  "file_func()")
 proxy_menu = (
  "Proxy Mode",
  "proxy_func()")
 doit_menu = (
  "Do It!",
  "doit_func()")
 help_menu = (
  "Help",
  "help_func()")
 exit_menu = (
  "Exit",
  "EXIT")
  # Add the topbar menus to screen object
 topbar_menu((file_menu, proxy_menu, doit_menu,
     help_menu, exit_menu))
  # Enter the topbar menu loop
  while
   topbar_key_handler():
  draw_dict()

根據(jù)由空行隔開的三部分,很容易理解 main() 函數(shù)。

第一部分執(zhí)行應用程序外觀的常規(guī)設置。為了建立應用程序元素之間的可預期間隔,交互式區(qū)域限制在 80 x 25 VT100/PC 屏幕大小(即使實際的終端窗口更大)。程序圍繞這個子窗口繪制一個框,并使用水平線畫出頂欄菜單的視覺偏移量。

第二部分建立應用程序所使用的菜單。函數(shù) topbar_menu() 使用一些技巧將熱鍵綁定到應用程序操作并用期望的視覺屬性來顯示菜單。請獲取源碼檔案(請參閱 參考資料 )以查看所有代碼。 topbar_menu() 應該是非常普通的。(歡迎將它合并到您自己的應用程序中。)非常重要的是一旦綁定了熱鍵,它們就 eval() 與菜單相關的字節(jié)組第二個元素中包含的字符串。例如,激活以上設置中的 "File" 菜單將調(diào)用 "eval("file_func()")"。所以就要求應用程序定義叫做 file_func() 的函數(shù),要求它返回一個布爾 (Boolean) 值以表示是否達到應用程序終止狀態(tài)。

第三部分只有兩行,但這正是整個應用程序?qū)嶋H運行的部分。函數(shù) topbar_key_handler() 就像它的名稱所暗示的:它等待擊鍵,然后處理它們。擊鍵處理程序可以會返回 Boolean false 值。(如果是這樣,則應用程序終止。)該應用程序中,鍵處理程序主要是檢查第二段中綁定的鍵。但即使您的 curses 應用程序綁定鍵的方式與該應用程序不同,您仍要使用類似的事件循環(huán)。處理程序的關鍵部分很可能使用以下這行代碼:

c = screen.getch()# read a keypress

對 draw_dict() 的調(diào)用只是事件循環(huán)中唯一的代碼。此函數(shù)繪制了 screen 窗口中幾處位置中的值。但在應用程序中,您可能想要將以下這行代碼:

screen.refresh()   # redraw the screen w/ any new output

加到繪制/刷新函數(shù)中(或只加到事件循環(huán)本身中)。

獲取用戶輸入

curses 應用程序以擊鍵事件的形式獲取所有用戶輸入。我們已經(jīng)看過了 .getch() 方法,現(xiàn)在讓我們看一下將 .getch() 與其它輸入方法組合在一起的例子 .getstr() 。以下就是我們以前提到的 file_func() 函數(shù)的縮寫版本(它由 "File" 菜單激活)。
curses_txt2html.py file_func() 函數(shù)

deffile_func
  ():
 s = curses.newwin(5,10,2,1)
 s.box()
 s.addstr(1,2,
  "I", hotkey_attr)
 s.addstr(1,3,
  "nput", menu_attr)
 s.addstr(2,2,
  "O", hotkey_attr)
 s.addstr(2,3,
  "utput", menu_attr)
 s.addstr(3,2,
  "T", hotkey_attr)
 s.addstr(3,3,
  "ype", menu_attr)
 s.addstr(1,2,
  "", hotkey_attr)
 s.refresh()
 c = s.getch()
 
  if
   c
  in
   (ord(
  'I'), ord(
  'i'), curses.KEY_ENTER, 10):
  curses.echo()
  s.erase()
  screen.addstr(5,33,
  " "*43, curses.A_UNDERLINE)
  cfg_dict[
  'source'] = screen.getstr(5,33)
  curses.noecho()
 
  else
  :
  curses.beep()
  s.erase()
 
  return
   CONTINUE

此函數(shù)組合了幾個 curses 特性。它做的第一件事就是創(chuàng)建另一個窗口對象。由于這個新窗口對象是 "File" 選擇項的實際下拉菜單,所以程序使用 .box() 方法圍著它繪制了一個框架。在窗口 s 中,程序繪制了幾個下拉菜單選項。使用了一種稍微費力的方法突出顯示了每個選項的熱鍵,這樣就與選項描述的其余部分形成了對比。(請查看完整源碼(請參閱 參考資料 )中的 topbar_menu() 以學習一種能稍微自動處理突出顯示的方法。)最后的 .addstr() 調(diào)用將光標移到缺省菜單選項。如同主屏幕一樣, s.refresh() 實際上顯示了畫到窗口對象上的元素。

繪制了下拉菜單后,程序使用簡單的 s.getch() 調(diào)用來獲取用戶的選擇項。在演示應用程序中,菜單只響應熱鍵,但不響應箭頭鍵或可移動突出顯示欄。可以通過捕捉附加鍵操作并在下拉菜單中設置事件循環(huán)來構建這些更復雜的菜單功能。但這個例子已經(jīng)足夠說明這種概念了。

接著,程序?qū)傋x取的擊鍵與各種熱鍵值做比較。在本例中,熱鍵的大小寫都可以激活下拉菜單選項,并且可以使用 ENTER 鍵激活缺省選項。(curses 特殊鍵常量看上去并不完全可靠,我發(fā)現(xiàn)必須添加實際的 ASCII 值 "10" 來捕捉 ENTER 鍵。)請注意,如果要執(zhí)行字符值比較,那么要將字符串封裝到 ord() 內(nèi)置 Python 函數(shù)中。

當選中 "Input" 選項時,程序會使用 .getstr() 方法,該方法提供帶有原始編輯能力的字段輸入(可以使用退格鍵)。由 ENTER 鍵終止輸入,然后方法返回輸入的值。通常會像上例中一樣,將這個值分配給一個變量。

為了在視覺上區(qū)別輸入字段,我使用了一點小技巧,預先向?qū)⒁l(fā)生數(shù)據(jù)輸入的區(qū)域添加了下劃線。無論如何,這都是必要的,但它添加了一種視覺效果。由以下這行代碼畫出下劃線:

screen.addstr(5,33, " "*43, curses.A_UNDERLINE)

當然,程序還必須除去下劃線,這項工作在 draw_dict() 刷新函數(shù)中由以下這行代碼執(zhí)行:

screen.addstr(5,33, " "*43, curses.A_NORMAL)

結(jié)束語

這里概述的技術以及在完整應用程序源代碼(請參閱 參考資料 )中使用的那些技術應該可以讓您初步了解 curses 編程。請使用它來編寫您的應用程序。它并不難使用。告訴您一個好消息,除了 Python 以外,有許多語言可以訪問 curses 庫,因此您學到的使用 Python curses 模塊的知識同樣適用于其它語言。

如果經(jīng)檢驗,基本 curses 模塊不能滿足您的要求,“參考資料”節(jié)中提供了許多模塊的鏈接,他們增添了 curses 的功能并提供了非常好的發(fā)展方向。

您可能感興趣的文章:

相關文章

  • Python?time模塊時間獲取和轉(zhuǎn)換方法

    Python?time模塊時間獲取和轉(zhuǎn)換方法

    這篇文章主要介紹了Python?time模塊時間獲取和轉(zhuǎn)換,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-05-05
  • python數(shù)組和矩陣的用法解讀

    python數(shù)組和矩陣的用法解讀

    這篇文章主要介紹了python數(shù)組和矩陣的用法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • Django搭建項目實戰(zhàn)與避坑細節(jié)詳解

    Django搭建項目實戰(zhàn)與避坑細節(jié)詳解

    這篇文章主要給大家介紹了關于Django搭建項目實戰(zhàn)與避坑細節(jié)的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-12-12
  • 使用Python爬取最好大學網(wǎng)大學排名

    使用Python爬取最好大學網(wǎng)大學排名

    這篇文章主要介紹了如何使用Python爬取最好大學網(wǎng)大學排名,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-02-02
  • web.py 十分鐘創(chuàng)建簡易博客實現(xiàn)代碼

    web.py 十分鐘創(chuàng)建簡易博客實現(xiàn)代碼

    web.py是一款輕量級的Python web開發(fā)框架,簡單、高效、學習成本低,特別適合作為python web開發(fā)的入門框架
    2016-04-04
  • 使用python matplotlib 畫圖導入到word中如何保證分辨率

    使用python matplotlib 畫圖導入到word中如何保證分辨率

    這篇文章主要介紹了使用python matplotlib 畫圖導入到word中如何保證分辨率的例子,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-04-04
  • Python實現(xiàn)模擬時鐘代碼推薦

    Python實現(xiàn)模擬時鐘代碼推薦

    本文給大家匯總介紹了下使用Python實現(xiàn)模擬時鐘的代碼,一共3個例子,后兩個是基于QT實現(xiàn),有需要的小伙伴可以參考下
    2015-11-11
  • 11月編程語言排行榜 Python逆襲C#上升到第4

    11月編程語言排行榜 Python逆襲C#上升到第4

    11月編程語言排行榜 Python逆襲C#上升到第4,無論在哪個榜單中 Python 都是保持著非同尋常的增長速度,為什么Python增長的這么快
    2017-11-11
  • 利用Python裁切tiff圖像且讀取tiff,shp文件的實例

    利用Python裁切tiff圖像且讀取tiff,shp文件的實例

    這篇文章主要介紹了利用Python裁切tiff圖像且讀取tiff,shp文件的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-03-03
  • OpenCV圖像輪廓的繪制方法

    OpenCV圖像輪廓的繪制方法

    這篇文章主要為大家詳細介紹了OpenCV圖像輪廓的繪制方法,以及測試幾何圖形、花朵圖形輪廓,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-08-08

最新評論