(點(diǎn)擊上方藍(lán)字,快速關(guān)注我們)

來源:starof

www.cnblogs.com/starof/p/4703820.html

如有好文章投稿,請點(diǎn)擊 → 這里了解詳情

來源:starof

www.cnblogs.com/starof/p/4703820.html

如有好文章投稿,請點(diǎn)擊 → 這里了解詳情

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

一、語法入門

1、打開和關(guān)閉一個(gè)curses 應(yīng)用程序

在任何代碼執(zhí)行前都先要初始化curses。初始化操作就是調(diào)用initscr()函數(shù),如下。該函數(shù)根據(jù)不同設(shè)備返回一個(gè)window對象代表整個(gè)屏幕,這個(gè)window對象通常叫做stdscr,和c語言報(bào)錯(cuò)一致。

import curses

stdscr= curses.initscr()

import curses

stdscr= curses.initscr()

使用curses通常要關(guān)閉屏幕回顯,目的是讀取字符僅在適當(dāng)?shù)沫h(huán)境下輸出。這就需要調(diào)用noecho()方法

curses.noecho()

curses.noecho()

應(yīng)用程序一般是立即響應(yīng)的,即不需要按回車就立即回應(yīng)的,這種模式叫cbreak模式,相反的常用的模式是緩沖輸入模式。開啟立即cbreak模式代碼如下。

curses.cbreak()

curses.cbreak()

終端經(jīng)常返回特殊鍵作為一個(gè)多字節(jié)的轉(zhuǎn)義序列,比如光標(biāo)鍵,或者導(dǎo)航鍵比如Page UP和Home鍵 。curses可以針對這些序列做一次處理,比如curses.KEY_LEFT返回一個(gè)特殊的值。要完成這些工作,必須開啟鍵盤模式。

stdscr.keypad(1)

stdscr.keypad(1)

關(guān)閉curses非常簡單,如下:

curses.nocbreak()#關(guān)閉字符終端功能(只有回車時(shí)才發(fā)生終端)

stdscr.keypad(0)

curses.echo()#打開輸入回顯功能

curses.nocbreak()#關(guān)閉字符終端功能(只有回車時(shí)才發(fā)生終端)

stdscr.keypad(0)

curses.echo()#打開輸入回顯功能

調(diào)用endwin()恢復(fù)默認(rèn)設(shè)置

curses.endwin()

curses.endwin()

調(diào)試curses時(shí)常見的問題就是curses應(yīng)用程序結(jié)束后沒有重置終端到之前的狀態(tài),把終端弄的一團(tuán)糟。python中該問題經(jīng)常是因?yàn)榇a有bug,發(fā)送異常引起的。比如鍵盤敲入字符后屏幕不回顯,這讓shell用起來非常困難。

為了避免這樣的問題,可以導(dǎo)入curses.wrapper模塊。這個(gè)函數(shù)做了一些初始化的工作,包括上面提到的和顏色的初始化。然后再執(zhí)行你提供的函數(shù),最后重置。而且被調(diào)用的函數(shù)寫在try-catch中。

2、打開新窗口和pad

通常調(diào)用initscr()獲取一個(gè)window對象代表全部屏幕。但是很多程序希望劃分屏幕為幾個(gè)小的窗口,為了重繪,擦出這些工作在小窗口中獨(dú)立進(jìn)行。newwin()函數(shù)就是用來新建一個(gè)新的窗口,需要給定窗口尺寸,并返回新的window對象的。

begin_x= 20;begin_y= 7

height= 5;width= 40

win= curses.newwin(height,width,begin_y,begin_x)

begin_x= 20;begin_y= 7

height= 5;width= 40

win= curses.newwin(height,width,begin_y,begin_x)

注意:坐標(biāo)通過是先y后x。這和別的坐標(biāo)系統(tǒng)不同,但是根深蒂固,寫的時(shí)候就這樣現(xiàn)在改太晚嘍。

當(dāng)調(diào)用一個(gè)方法去顯示或者擦除文本時(shí),效果不會(huì)立即顯示。 為了減少屏幕重繪的時(shí)間,curses就先累積這些操作,用一種更有效的方式去顯示。就比如說你的程序先在窗口顯示了幾個(gè)字符,然后就清除屏幕,那就沒必要發(fā)送初始字符了,因?yàn)樗鼈儾粫?huì)被顯示。

因此,curses需要你使用refresh()函數(shù)明確指出重繪窗口。

pad

pad是window的特例。pad可以比顯示的屏幕大,一次只顯示pad的一部分。創(chuàng)建一個(gè)pad很簡單,只需要提供寬高即可。但是刷新pad需要提供屏幕上顯示的部分pad的坐標(biāo)。

pad= curses.newpad(100,100)

# These loops fill the pad with letters; this is

# explained in the next section

foryinrange(0,100):

forxinrange(0,100):

try:

pad.addch(y,x,ord('a')+ (x*x+y*y)% 26)

except curses.error:

pass

# Displays a section of the pad in the middle of the screen

pad.refresh(0,0,5,5,20,75)

pad= curses.newpad(100,100)

# These loops fill the pad with letters; this is

# explained in the next section

foryinrange(0,100):

forxinrange(0,100):

try:

pad.addch(y,x,ord('a')+ (x*x+y*y)% 26)

except curses.error:

pass

# Displays a section of the pad in the middle of the screen

pad.refresh(0,0,5,5,20,75)

同時(shí)由多個(gè)window或者多個(gè)pad,有一問題:刷新某個(gè)window或pad時(shí)屏幕會(huì)閃爍。

避免閃爍的方法:在每個(gè)window調(diào)用noutrefresh()方法。 然后使用refresh()方法的最后再調(diào)用doupdate()方法。

3、顯示文本

addscr不同格式如下:如果沒有坐標(biāo),字符顯示在上一次操作完的位置。

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

4、屬性和顏色

屬性和描述:

屏幕第一行reverse-video顯示。

stdscr.addstr(0,0,"Current mode: Typing mode",

curses.A_REVERSE)

stdscr.refresh()

stdscr.addstr(0,0,"Current mode: Typing mode",

curses.A_REVERSE)

stdscr.refresh()

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

使用顏色對1顯示一行

stdscr.addstr("Pretty text",curses.color_pair(1))

stdscr.refresh()

stdscr.addstr("Pretty text",curses.color_pair(1))

stdscr.refresh()

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為紅色文本,白色背景:

curses.init_pair(1, curses.COLOR_RED, curses.COLOR_WHITE)

curses.init_pair(1, curses.COLOR_RED, curses.COLOR_WHITE)

使用:

stdscr.addstr(0,0, "RED ALERT!", curses.color_pair(1))

stdscr.addstr(0,0, "RED ALERT!", curses.color_pair(1))

5、用戶輸入

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

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

代碼經(jīng)常這樣寫

while1:

c= stdscr.getch()

ifc== ord('p'):

PrintDocument()

elifc== ord('q'):

break# Exit the while()

elifc== curses.KEY_HOME:

x= y= 0

while1:

c= stdscr.getch()

ifc== ord('p'):

PrintDocument()

elifc== ord('q'):

break# Exit the while()

elifc== curses.KEY_HOME:

x= y= 0

getstr()獲取一個(gè)字符串。因?yàn)楣δ苡邢薏怀S谩?/p>

curses.echo()# Enable echoing of characters

# Get a 15-character string, with the cursor on the top line

s= stdscr.getstr(0,0,15)

curses.echo()# Enable echoing of characters

# Get a 15-character string, with the cursor on the top line

s= stdscr.getstr(0,0,15)

二、例子

代碼如下:

執(zhí)行:# python testcurses.py

三、排錯(cuò)

報(bào)錯(cuò):

[root@yl-web-test srv]# python curses.py

Traceback(most recent call last):

File"curses.py",line2,in<module>

import curses

File"/srv/curses.py",line4,in<module>

stdscr= curses.initscr()

AttributeError: 'module'objecthas no attribute'initscr'

[root@yl-web-test srv]# python curses.py

Traceback(most recent call last):

File"curses.py",line2,in<module>

import curses

File"/srv/curses.py",line4,in<module>

stdscr= curses.initscr()

AttributeError: 'module'objecthas no attribute'initscr'

原因:因?yàn)槲业奈募∶莄urses.py,而系統(tǒng)也是用的curses.py,python執(zhí)行時(shí)先從當(dāng)前目錄查找,所以不能和系統(tǒng)文件重名。

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

參考:

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

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

看完本文有收獲?請轉(zhuǎn)發(fā)分享給更多人

關(guān)注「Python開發(fā)者」,提升Python技能

1.《python curses 使用》援引自互聯(lián)網(wǎng),旨在傳遞更多網(wǎng)絡(luò)信息知識,僅代表作者本人觀點(diǎn),與本網(wǎng)站無關(guān),侵刪請聯(lián)系頁腳下方聯(lián)系方式。

2.《python curses 使用》僅供讀者參考,本網(wǎng)站未對該內(nèi)容進(jìn)行證實(shí),對其原創(chuàng)性、真實(shí)性、完整性、及時(shí)性不作任何保證。

3.文章轉(zhuǎn)載時(shí)請保留本站內(nèi)容來源地址,http://f99ss.com/junshi/3877.html