Python curses示例

Curses库提供独立于终端的屏幕绘制界面,如果你想在linux下实现一个文本输出界面,可以尝试一下curses。

开始

初始化curses:

1
2
import curses
stdscr = curses.initscr()

关闭屏幕回显:

1
curses.noecho()

开启cbreak模式(单键输入响应,不需回车):

1
curses.cbreak()

开启键盘模式(允许处理特殊键如PageDown):

1
stdscr.keypad(1)

阻塞:

1
2
stdscr.nodelay(0) # 阻塞
stdscr.nodelay(1) # 非阻塞

接受输入:

1
stdscr.getch()

关闭curses,需要反向操作还原设置:

1
2
3
4
curses.nocbreak()
stdscr.keypad(0)
curses.echo()
curses.endwin()

例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#!/usr/bin/env python3
import curses
import time
class CursesHandle:
def __init__(self):
'''设置字符串输出位置x与y'''
self.x = 0
self.y = 0
self.stdscr = None

def __enter__(self):
'''with使用,初始化curses并设置环境,start_color()、init_pair设置文字与背景颜色'''
self.stdscr = curses.initscr()
curses.start_color()
curses.init_pair(1, curses.COLOR_GREEN, curses.COLOR_BLACK)
curses.init_pair(2, curses.COLOR_RED, curses.COLOR_BLACK)
curses.noecho()
curses.cbreak()
self.stdscr.keypad(1)
self.stdscr.nodelay(1)
return self

def __exit__(self, exc_ty, exc_val, tb):
'''with使用,退出时还原环境'''
curses.nocbreak()
self.stdscr.keypad(0)
curses.echo()
curses.endwin()
self.stdscr = None

def display_info(self, words, color=1, x=None, y=None):
if x is None:
x = self.x
if y is None:
y = self.y
'''打印words字符串,color为1绿2红,在环境里已设置'''
if self.stdscr is None:
raise Exception('ERROR: Not self.stdscr exist!')
self.stdscr.addstr(y, x, words, curses.color_pair(color))
self.stdscr.refresh()

def get_input_and_continue(self):
'''设置中断,等待输入后恢复'''
if self.stdscr is None:
raise Exception('ERROR: Not self.stdscr exist!')
self.stdscr.nodelay(0)
ch = self.stdscr.getch()
self.stdscr.nodelay(1)

def get_input_and_exit(self):
'''当输入字符为q后退出'''
if self.stdscr is None:
raise Exception('ERROR: Not self.stdscr exist!')
ch = self.stdscr.getch()
if ch == ord('q'):
exit(0)

if __name__ == '__main__':
num = 1
with CursesHandle() as cur:
cur.display_info('输入任意值开始!')
cur.get_input_and_continue()
while num < 10:
cur.display_info(str(num), x=10, y=10)
num+=1
time.sleep(1)

例子一开始显示“输入任意值开始”,输入任意值后,计时10秒并退出

结尾

Curses是我为了写多行实时刷新查到的一个模块,使用过程中也遇到一些蛋疼问题,比如退出时没开回显导致终端异常,但这个模块在日常工作中或许有用到的机会,还是记录以待后面回顾。

参考:starof的博客


- - END - -


腾讯云
0%