国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費(fèi)電子書(shū)等14項(xiàng)超值服

開(kāi)通VIP
Linux教程 - 正文 - Curses編程 Curses編程 給初學(xué)者的提示
某一類(lèi) Python 應(yīng)用程序最好使用交互式用戶(hù)界面,這樣可以消除圖形環(huán)境的系統(tǒng)開(kāi)銷(xiāo)或復(fù)雜性。交互式文本模式程序(在 Linux/UNIX中),例如封裝在 Python 的標(biāo)準(zhǔn) curses 模塊中的ncurses 庫(kù),正是您所需要的。本文中,David Mertz 討論了在Python 中 curses 的用法。他使用從前端到 Txt2Html 程序的樣本源代碼闡述了 curses 環(huán)境。

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

  介紹 curses

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

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

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

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

  應(yīng)用程序

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

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

  X終端上的應(yīng)用程序

  Linux終端上的應(yīng)用程序

  封裝 curses 應(yīng)用程序

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

  在初始化 curses之后,可以用各種方式修改或完全禁用面向流的控制臺(tái)輸入和輸出。這基本上就是使用 curses的全部重點(diǎn)??墒且坏└牧肆魇娇刂婆_(tái)交互,如果程序出錯(cuò),將不會(huì)以正常方式顯示 Python 追溯事件。Andrew Kuchling使用一個(gè)很好的 curses 程序頂級(jí)框架解決了這個(gè)問(wèn)題(請(qǐng)參閱參考資料中他的教程)。

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

  Python [curses] 程序的頂層設(shè)置代碼

  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ù)來(lái)執(zhí)行實(shí)際工作,然后執(zhí)行最后的清除。如果出錯(cuò),except 代碼塊會(huì)將控制臺(tái)恢復(fù)成缺省狀態(tài),然后報(bào)告遇到的異常。

  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ù)由空行隔開(kāi)的三部分,很容易理解main() 函數(shù)。

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

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

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

  c = screen.getch()# read a keypress

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

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

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

  獲取用戶(hù)輸入

curses 應(yīng)用程序以擊鍵事件的形式獲取所有用戶(hù)輸入。我們已經(jīng)看過(guò)了.getch() 方法,現(xiàn)在讓我們看一下將.getch()與其它輸入方法組合在一起的例子.getstr()。以下就是我們以前提到的 file_func() 函數(shù)的縮寫(xiě)版本(它由 "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 cin (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ù)組合了幾個(gè) curses 特性。它做的第一件事就是創(chuàng)建另一個(gè)窗口對(duì)象。由于這個(gè)新窗口對(duì)象是 "File"選擇項(xiàng)的實(shí)際下拉菜單,所以程序使用.box() 方法圍著它繪制了一個(gè)框架。在窗口s中,程序繪制了幾個(gè)下拉菜單選項(xiàng)。使用了一種稍微費(fèi)力的方法突出顯示了每個(gè)選項(xiàng)的熱鍵,這樣就與選項(xiàng)描述的其余部分形成了對(duì)比。(請(qǐng)查看完整源碼(請(qǐng)參閱參考資料)中的topbar_menu() 以學(xué)習(xí)一種能稍微自動(dòng)處理突出顯示的方法。)最后的.addstr()調(diào)用將光標(biāo)移到缺省菜單選項(xiàng)。如同主屏幕一樣,s.refresh() 實(shí)際上顯示了畫(huà)到窗口對(duì)象上的元素。

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

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

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

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

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

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

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

  結(jié)束語(yǔ)

這里概述的技術(shù)以及在完整應(yīng)用程序源代碼(請(qǐng)參閱參考資料)中使用的那些技術(shù)應(yīng)該可以讓您初步了解 curses編程。請(qǐng)使用它來(lái)編寫(xiě)您的應(yīng)用程序。它并不難使用。告訴您一個(gè)好消息,除了 Python 以外,有許多語(yǔ)言可以訪(fǎng)問(wèn) curses庫(kù),因此您學(xué)到的使用 Python curses 模塊的知識(shí)同樣適用于其它語(yǔ)言。

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

  參考資料

* Andrew Kuchling 編寫(xiě)了curses 編程的介紹性教程,名稱(chēng)是Curses Programming WithPython。本文中的一部分就受到了 Kuchling 的例子啟發(fā),盡管它涵蓋了 curses 編程的不同元素(主要在更高層次上)。

  * 請(qǐng)?jiān)L問(wèn)最好的常規(guī)初學(xué)者園地,以獲取關(guān)于 Python 中基于文本的用戶(hù)界面工具的信息。

  * Pythonncurses 是一個(gè)增強(qiáng)模塊,與 Python 1.5.2 curses 相比,它支持更多ncurses 功能。有一些初步計(jì)劃設(shè)想讓ncurses 替換掉 Python 2.0.ncurses 中的 curses。

  * Tinter 是構(gòu)建在 curses 上的高級(jí)窗口小部件的一個(gè)模塊。Tinter 支持按鈕、文本框、對(duì)話(huà)框和進(jìn)展欄。

  * 一種沒(méi)有充分引起公眾注意的(并且難以捕捉到的) ncurses 和其它各種封裝器的備用產(chǎn)品結(jié)合了slang 和newt 以及 python 封裝器模塊snack。slang 的功能與 curses 一樣,而且newt 的功能與Tinter 一樣。

  * 請(qǐng)查看snack 的一些例子。

* pcrt 是用于直接 ANSI 轉(zhuǎn)義碼屏幕訪(fǎng)問(wèn)的模塊。它使用特殊顏色和屬性將字符寫(xiě)到屏幕的特定位置上。它是一個(gè)低級(jí)接口(甚至比curses 更低級(jí)),它只能在支持 ANSI 轉(zhuǎn)義碼(占了轉(zhuǎn)義碼的大多數(shù))的控制臺(tái)上工作,但它卻是為文本模式應(yīng)用程序添加閃爍的好方法。

* dialog 是一個(gè)類(lèi)似于 Linuxdialog 實(shí)用程序的 Python 封裝器。實(shí)用程序(以及它的 Python封裝器)可以創(chuàng)建“是/否”、菜單、輸入、消息文本、信息復(fù)選列表和單選列表對(duì)話(huà)框。如果沒(méi)有平臺(tái)問(wèn)題,您可以使用這個(gè)實(shí)用程序和模塊迅速完成大量工作(當(dāng)然,目標(biāo) Linux 發(fā)行版必須有dialog)。

  * 下載本文中使用和提到的文件。

  關(guān)于作者

David Mertz 相信上帝給了我們鍵盤(pán)和 TTY,而其它所有界面設(shè)備都是完全是人類(lèi)的杰作。可以通過(guò)mertz@gnosis.cx 與David 取得聯(lián)系。http://gnosis.cx/publish/上刊登了他寫(xiě)的文章。非常歡迎對(duì)過(guò)去的、這一篇或?qū)?lái)的專(zhuān)欄文章提出意見(jiàn)和建議。
本文來(lái)自:Linux教程 -- http://doc.linuxpk.com/2886.html
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶(hù)發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
Python curses庫(kù)如何使用
[Python]年度黑馬Python 自省指南
Python中的面向?qū)ο缶幊淘斀?下)
Python yield與實(shí)現(xiàn)
可愛(ài)的 Python:Python 中的 TK編程
線(xiàn)程知識(shí)總結(jié)
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服