python curses使用

發表於2017-03-24

python 中curses封裝了c語言的curses,把c中複雜部分簡單化,比如addstr(),mvaddstr(),mvwaddstr()合併成了一個addstr()方法。

一、語法入門

1、開啟和關閉一個curses 應用程式

在任何程式碼執行前都先要初始化curses。初始化操作就是呼叫initscr()函式,如下。該函式根據不同裝置返回一個window物件代表整個螢幕,這個window物件通常叫做stdscr,和c語言報錯一致。

使用curses通常要關閉螢幕回顯,目的是讀取字元僅在適當的環境下輸出。這就需要呼叫noecho()方法

應用程式一般是立即響應的,即不需要按回車就立即迴應的,這種模式叫cbreak模式,相反的常用的模式是緩衝輸入模式。開啟立即cbreak模式程式碼如下。

終端經常返回特殊鍵作為一個多位元組的轉義序列,比如游標鍵,或者導航鍵比如Page UP和Home鍵 。curses可以針對這些序列做一次處理,比如curses.KEY_LEFT返回一個特殊的值。要完成這些工作,必須開啟鍵盤模式。

關閉curses非常簡單,如下:

呼叫endwin()恢復預設設定

除錯curses時常見的問題就是curses應用程式結束後沒有重置終端到之前的狀態,把終端弄的一團糟。python中該問題經常是因為程式碼有bug,傳送異常引起的。比如鍵盤敲入字元後螢幕不回顯,這讓shell用起來非常困難。

為了避免這樣的問題,可以匯入curses.wrapper模組。這個函式做了一些初始化的工作,包括上面提到的和顏色的初始化。然後再執行你提供的函式,最後重置。而且被呼叫的函式寫在try-catch中。

2、開啟新視窗和pad

通常呼叫initscr()獲取一個window物件代表全部螢幕。但是很多程式希望劃分螢幕為幾個小的視窗,為了重繪,擦出這些工作在小視窗中獨立進行。newwin()函式就是用來新建一個新的視窗,需要給定視窗尺寸,並返回新的window物件的。

注意:座標通過是先y後x。這和別的座標系統不同,但是根深蒂固,寫的時候就這樣現在改太晚嘍。

當呼叫一個方法去顯示或者擦除文字時,效果不會立即顯示。 為了減少螢幕重繪的時間,curses就先累積這些操作,用一種更有效的方式去顯示。就比如說你的程式先在視窗顯示了幾個字元,然後就清除螢幕,那就沒必要傳送初始字元了,因為它們不會被顯示。

因此,curses需要你使用refresh()函式明確指出重繪視窗。

pad

pad是window的特例。pad可以比顯示的螢幕大,一次只顯示pad的一部分。建立一個pad很簡單,只需要提供寬高即可。但是重新整理pad需要提供螢幕上顯示的部分pad的座標。

同時由多個window或者多個pad,有一問題:重新整理某個window或pad時螢幕會閃爍。

避免閃爍的方法:在每個window呼叫noutrefresh()方法。 然後使用refresh()方法的最後再呼叫doupdate()方法。

3、顯示文字

addscr不同格式如下:如果沒有座標,字元顯示在上一次操作完的位置。

Form Description
str or ch Display the string str or character ch at the current position
str or ch, attr Display the string str or character ch, using attribute attr at the current position
y, x, str or ch Move to position y,x within the window, and display str or ch
y, x, str or ch, attr Move to position y,x within the window, and display str or ch, using attribute attr

屬性可以讓文字高亮顯示,比如黑體,下劃線,倒序,彩色顯示。

4、屬性和顏色

屬性和描述:

Attribute Description
A_BLINK Blinking text
A_BOLD Extra bright or bold text
A_DIM Half bright text
A_REVERSE Reverse-video text
A_STANDOUT The best highlighting mode available
A_UNDERLINE Underlined text

螢幕第一行reverse-video顯示。

curses使用前景色和背景色,可通過color_pair()方法獲取一對顏色。

使用顏色對1顯示一行

start_color()初始化了8中基本顏色:0:black, 1:red, 2:green, 3:yellow, 4:blue, 5:magenta, 6:cyan, and 7:white。

init_pair(n,f,b)修改顏色對n,讓f為前景色,b為背景色。顏色對0天生的黑白色,不允許改。

比如:修改color1為紅色文字,白色背景:

使用:

5、使用者輸入

獲取輸入一遍使用getch()方法,這個方法暫停等待使用者輸入,顯示用echo()方法。

getch()返回一個整數 ,在0到255之間,表示輸入字元的ASCII值。列印255的是些特殊字元,比如Page Up,Home。

程式碼經常這樣寫

getstr()獲取一個字串。因為功能有限不常用。

二、例子

程式碼如下:

執行:# python testcurses.py

三、排錯

報錯:

原因:因為我的檔案取名是curses.py,而系統也是用的curses.py,python執行時先從當前目錄查詢,所以不能和系統檔案重名。

換個名字,比如改名為testcurses.py 就好了。

參考:

https://docs.python.org/2/howto/curses.html

請使用手機”掃一掃”x

請使用手機”掃一掃”x

相關文章