中文字幕免费精品_亚洲视频自拍_亚洲综合国产激情另类一区_色综合咪咪久久

簡單的Python的curses庫使用教程
來源:易賢網 閱讀:1611 次 日期:2015-04-14 15:07:19
溫馨提示:易賢網小編為您整理了“簡單的Python的curses庫使用教程”,方便廣大網友查閱!

curses 庫 ( ncurses ) 提供了控制字符屏幕的獨立于終端的方法。curses 是大多數(shù)類似于 UNIX 的系統(tǒng)(包括 Linux)的標準部分,而且它已經移植到 Windows 和其它系統(tǒng)。curses 程序將在純文本系統(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 轉換程序)編寫的封裝器,作為本文的測試應用程序。Txt2Html 有幾種運行方式。但為了與本文的目的保持一致,我們將研究從命令行運行的 Txt2Html。操作 Txt2Html 的一種方式是向它提供一組命令行變量(它們說明要執(zhí)行的轉換的各方面),然后將應用程序當作批處理運行。對于偶爾使用的用戶,一個更友好的用戶界面提供了一個交互式選擇屏幕,它可以在執(zhí)行實際轉換之前,引導用戶遍歷轉換選項(提供選中選項的視覺反饋)。

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

X終端上的應用程序

名單

2015411164836286.gif (486×262)

Linux終端上的應用程序

名單1

2015411164913129.gif (667×430)

封裝 curses 應用程序

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

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

以下模板(基本上與 Kuchling 的相同)保留在正常命令行 Python 的錯誤報告功能:

Python [curses] 程序的頂層設置代碼

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

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

現(xiàn)在,我們研究 main() 函數(shù),看看 curses_txt2html 做些什么:

curses_txt2html.py main() 函數(shù)和事件循環(huán)

?123456789101112131415161718192021222324252627282930313233 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" 菜單將調用 "eval("file_func()")"。所以就要求應用程序定義叫做 file_func() 的函數(shù),要求它返回一個布爾 (Boolean) 值以表示是否達到應用程序終止狀態(tài)。

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

c = screen.getch()# read a keypress

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

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

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

獲取用戶輸入

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

curses_txt2html.py file_func() 函數(shù)

?123456789101112131415161718192021222324252627282930313233343536373839404142 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() 調用將光標移到缺省菜單選項。如同主屏幕一樣, s.refresh() 實際上顯示了畫到窗口對象上的元素。

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

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

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

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

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

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

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

結束語

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

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

更多信息請查看IT技術專欄

更多信息請查看腳本欄目
易賢網手機網站地址:簡單的Python的curses庫使用教程

2026上岸·考公考編培訓報班

  • 報班類型
  • 姓名
  • 手機號
  • 驗證碼
關于我們 | 聯(lián)系我們 | 人才招聘 | 網站聲明 | 網站幫助 | 非正式的簡要咨詢 | 簡要咨詢須知 | 新媒體/短視頻平臺 | 手機站點 | 投訴建議
工業(yè)和信息化部備案號:滇ICP備2023014141號-1 云南省教育廳備案號:云教ICP備0901021 滇公網安備53010202001879號 人力資源服務許可證:(云)人服證字(2023)第0102001523號
聯(lián)系電話:0871-65099533/13759567129 獲取招聘考試信息及咨詢關注公眾號:hfpxwx
咨詢QQ:1093837350(9:00—18:00)版權所有:易賢網
中文字幕免费精品_亚洲视频自拍_亚洲综合国产激情另类一区_色综合咪咪久久
国产精品yjizz| 狠狠色噜噜狠狠色综合久| 欧美三级资源在线| ●精品国产综合乱码久久久久| 亚洲尤物视频在线| 影音先锋在线一区| 国产精品嫩草久久久久| 久久人人看视频| 亚洲另类一区二区| 国产一区二区三区久久久| 午夜精品在线观看| 在线精品一区| 国产区日韩欧美| 欧美日韩亚洲一区二区三区在线 | 欧美有码在线观看视频| 国产日韩欧美制服另类| 欧美精品三级日韩久久| 中文久久精品| 91久久综合| 国产精品久久久久高潮| 久久久999| 欧美一区高清| 一本一本久久a久久精品牛牛影视| 一区二区三区自拍| 国内精品伊人久久久久av影院 | 在线精品一区| 欧美福利在线观看| 亚洲午夜未删减在线观看| 亚洲国产高清一区二区三区| 欧美日韩国产精品一区| 久久久人成影片一区二区三区观看 | 久久婷婷丁香| ●精品国产综合乱码久久久久| 久久综合综合久久综合| 一区二区高清| 久久久久久久性| 一区二区三区视频在线播放| 亚洲美女精品一区| 亚洲三级免费电影| 亚洲经典在线| 亚洲国产日韩在线| 韩日精品视频一区| 国产综合18久久久久久| 亚洲精品一级| 国产在线观看91精品一区| 国产精品久久久久久久久久久久 | 午夜精品一区二区三区在线| 亚洲人被黑人高潮完整版| 国产一区二区三区观看 | 国产精品午夜电影| 欧美午夜视频一区二区| 欧美激情中文字幕一区二区| 麻豆精品视频| 欧美黄色片免费观看| 欧美激情视频在线免费观看 欧美视频免费一| 久久精品国产亚洲一区二区| 亚洲欧美久久久| 亚洲欧洲av一区二区三区久久| 欧美在线地址| 久久免费视频网| 亚洲欧美日韩另类| 欧美在线播放高清精品| 久久婷婷综合激情| 欧美另类高清视频在线| 国产欧美一区二区精品仙草咪| 国内精品福利| 欧美一区国产二区| 欧美高清视频免费观看| 国产精品成人一区二区网站软件| 国产日韩精品一区| 亚洲精品护士| 久久九九久精品国产免费直播 | 亚洲欧美国产高清| 久久综合999| 国产日韩一区在线| 亚洲狼人精品一区二区三区| 一区二区福利| 欧美wwwwww| 国产一区二区日韩精品欧美精品| 亚洲精品久久在线| 久久色中文字幕| 在线看片欧美| 狼狼综合久久久久综合网 | 亚洲欧美日韩在线不卡| 国产精品久久久久免费a∨ | 亚洲第一在线| 中文国产亚洲喷潮| 亚洲欧美另类在线| 欧美日韩免费观看一区二区三区| 亚洲一区在线播放| 亚洲精品男同| 91久久国产综合久久| 国产一区二区三区电影在线观看| 欧美国产日本在线| 国产精品手机视频| 午夜精品久久| 在线观看日韩欧美| 欧美高清你懂得| 亚洲一区二区精品视频| 亚洲美女视频在线观看| 免费欧美在线视频| 亚洲成人在线免费| 亚洲视频在线观看| 亚洲女性裸体视频| 免费亚洲电影在线| 国产欧美精品日韩| 亚洲视频免费观看| 亚洲欧美一区二区精品久久久| 亚洲一区二区免费在线| 美腿丝袜亚洲色图| 欧美三级电影精品| 欧美日韩国产精品一卡| 欧美性大战xxxxx久久久| 日韩性生活视频| 久久久www成人免费精品| 国内精品写真在线观看| 欧美成人免费网站| 欧美淫片网站| 午夜精品福利一区二区蜜股av| 亚洲欧洲精品一区| 在线观看亚洲精品视频| 国产一区二区看久久| 国产欧美韩国高清| 国产一区视频网站| 一区二区亚洲欧洲国产日韩| 国产一区日韩一区| 国内精品久久久久久久果冻传媒| 国产丝袜美腿一区二区三区| 国产女主播一区二区三区| 国产精品久久久久9999高清 | 久久亚洲欧美国产精品乐播| 欧美激情网站在线观看| 久久久水蜜桃av免费网站| 一区二区三区在线视频观看| 亚洲香蕉视频| 性感少妇一区| 在线看欧美视频| 欧美日韩亚洲一区三区| 激情文学一区| 亚洲欧美日本日韩| 欧美久久成人| 中文久久精品| 国产精品资源| 另类成人小视频在线| 亚洲午夜视频| 亚洲人精品午夜| 国产精品亚洲综合一区在线观看| 国产精品vvv| 亚洲福利久久| 久久久久九九视频| 欧美日韩三级电影在线| 亚洲精品一二区| 欧美精品尤物在线| 亚洲一区制服诱惑| 在线看日韩欧美| 欧美视频日韩视频| 亚洲国产色一区| 欧美成人精品一区| 亚洲欧美另类在线观看| 国产人成一区二区三区影院| 欧美日韩a区| 久久精视频免费在线久久完整在线看| 亚洲美女电影在线| 久久久九九九九| 亚洲精品欧美| 国产亚洲精品久久久久动| 在线观看视频日韩| 宅男精品导航| 欧美日韩高清在线一区| 亚洲国产高清一区| 噜噜噜久久亚洲精品国产品小说| 国产乱子伦一区二区三区国色天香| 亚洲高清一区二区三区| 久久精品国产精品亚洲精品| 国产精品日韩久久久久| 夜夜嗨一区二区三区| 欧美日韩精品一区二区三区四区 | 你懂的网址国产 欧美| 国外视频精品毛片| 久久中文字幕一区| 91久久精品美女| 欧美日韩一区二区三区视频| 亚洲精品小视频| 欧美乱大交xxxxx| 亚洲视频在线观看免费| 欧美天天视频| 午夜在线播放视频欧美| 狠狠干综合网| 欧美另类人妖| 欧美一区二区三区男人的天堂| 国产日韩av一区二区| 久久久中精品2020中文| 亚洲国产一区视频| 国产精品第一区| 久久在线视频| 亚洲欧美成人一区二区在线电影| 国产午夜精品在线观看| 欧美精品久久久久久久| 性高湖久久久久久久久| 在线观看亚洲视频|