Curses Programming with Python

摘要,这篇文章介绍如何用Python 2.x编写文本模式的程序;使用curses扩展模块控制显示。 原文地址

curses是什么

curses库针对基于文本的终端提供终端独立屏幕绘制、键盘输入处理的机制。这样的终端有VT100s、Linux控制台和X11程序提供的模拟终端如xterm、rxvt。显示终端支持非常多的控制代码来执行常用的操作如移动光标、滚动屏幕和清除屏幕。不同的终端使用不同的代码,而且经常有自己的习惯模式。

在X显示模式的世界中,人们会问还有这个必要吗?因为以字符单元显示的终端已经是过时的技术了。但在这样的限制中依然可以做很多有趣的事情,这是值得的。因为在小型机或嵌入式Unix中是没有X server的。另一方面系统安装工具或者内核配置必须在X server可用(启动)之前进行。

curses库屏蔽了不同终端的细节,提供用于显示的编程抽象,包括多个非重叠的窗口。窗口的内容有非常多的方式来改变-添加文本、清除、改变属性,curse库会自动计算需要发送哪些代码到终端得到正确的输出。

curse库起初是写给BSD Unix的,来自AT&T的后续版本System V添加了很多增强和新的函数。BSD curses不再维护了,被ncurses代替,是AT&T接口的开源实现。如果你使用开源Unix像Linux或FreeBSD,你的系统几乎完全使用ncurses。由于很多商业的系统基于System V代码,这些系统会提供完全的函数描述。老版本的curses可能存在不兼容。

没人提供支持windows的类似模块,你可以试试Fredrik Lundh写的终端模块,这个模块提供了可寻址的文本输出,额外支持鼠标和键盘输入,访问地址:http://effbot.org/zone/console-index.htm

Python curses module

python的curses是基于C的curses函数库封装的;如果你很熟悉C的curses编程,很容易转到Python。最大的不同是Python的接口更简单,合并了C中的addstr(),mvaddstr(),mvwaddstr()到addstr()中,后面你会见到更详细的介绍。

这篇HOWTO只是简单的介绍,它不是curses API的完整介绍,你可以阅读Python中ncurses库详细内容,或者是C中ncurses的手册。

Starting and ending a curses application

stdscr = curses.initscr():curses必须初始化,通过initscr()函数实现,它决定终端的类型、发送必要的初始化代码到终端以及创建各种内部的数据结构。成功后会返回一个窗口对象打印整个屏幕;通常称为atdscr,这是C变量中对应的名称。

curses.noecho():会关闭自动输出key到屏幕上,尤其是读取密钥、密码的情况下。

curses.cbreak():需要在没有输入Enter时立即响应键入,这个被称为cbreak modebuffered input mode相对应。

stdscr.keypad(1):允许键盘模式,能够输出光标、方向键,通过curses.KEY_LEFT获取。

curses.nocbreak(); stdscr.keypad(0); curses.echo():一次执行终止应用。

curses.endwin():恢复原始操作模式。

curses.wrapper():在debug中很有用,预防程序崩溃时遗留代码弄乱终端。它会做许多初始化工作,在try-catch语句中调用。

Windows and Pads

窗口是最基本的抽象,代表屏幕的矩形区域。它支持多个方法支持展示文本、清除、允许用户输入等。

stdscr对象由initscr()返回,包含整个屏幕。newwin()返回指定尺寸的窗口:

begin_x = 20; begin_y = 7  
height = 5; width = 40  
win = curses.newwin(height, width, begin_y, begin_x)  

coordinate system:坐标系统,y,x方式传递,左上角坐标是(0,0)。

curses的windows不会马上显示内容的变化,内置300 baud(300波特)。这一机制给了curses时间去收集比较变化,高效显示信息。

refresh()明确告知curses刷新信息。

pad是一种特别的窗口,可比实际的屏幕大,一次只显示部分。

Displaying Text

stdscr对象提供统一api入口,addstr()接收非常多形式的参数,通常有四种。

y, x, str or ch, attr中的attr提供属性显示高亮的内容:加粗、下划线、反转、颜色等。窗口会记住最后一次操作的光标位置。

move(y,x):移动光标。

curs_set(0):光标不可见。

Attributes and Color

属性用整数表示,不同的字节位表示不同的属性。:

  • 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

使用颜色,要在initscr()方法后调用start_color()方法。

has_colors():确认是否有这个颜色。

foreground:前景色。background:背景色。有8个基本颜色。

init_pair(n, f, b):定义颜色对。

User Input

python提供用户输入空间:test-input

getch():等待用户输入。用户输入的字符会被转换成ascii码。

getstr()

For More Information

HOWTO模块不会包含高级内容,只做简单介绍。