15.11. curses —字符单元显示的终端处理

在版本 1.6 中进行了更改:添加了对ncurses库的支持并转换为程序包。

curses模块提供了 curses 库的接口,curses 库是便携式高级终端处理的事实上的标准。

尽管 curses 在 Unix 环境中使用最广泛,但它的版本可用于 DOS,OS/2 以及可能的其他系统。此扩展模块旨在与 ncurses 的 API 相匹配,ncurses 是在 Linux 和 Unix 的 BSD 变体上托管的开源 curses 库。

Note

从 5.4 版开始,ncurses 库决定如何使用nl_langinfo函数解释非 ASCII 数据。这意味着您必须在应用程序中调用locale.setlocale()并使用系统可用的编码之Pair Unicode 字符串进行编码。本示例使用系统的默认编码:

import locale
locale.setlocale(locale.LC_ALL, '')
code = locale.getpreferredencoding()

然后使用* code *作为str.encode()呼叫的编码。

See also

  • Module curses.ascii

  • 不管您的区域设置如何,使用 ASCII 字符的 Util。

  • Module curses.panel

  • 面板集扩展,可增加 curses 窗口的深度。

  • Module curses.textpad

  • 可编辑的文本小部件,用于支持类似 Emacs 的绑定的 curses。

  • 用 Pythoncurses 编程

  • Andrew Kuchling 和 Eric Raymond 撰写的有关在 Python 上使用 curses 的教程材料。

Python 源代码发行版中的Demo/curses/目录包含一些使用此模块提供的 curses 绑定的示例程序。

15.11.1. Functions

模块curses定义以下异常:

Note

每当函数或方法的* x y 参数是可选的时,它们默认为当前光标位置。每当 attr *是可选的时,它默认为A_NORMAL

curses模块定义以下Function:

在窗口上执行了诸如addstr()之类的写操作之后,可以passnoutrefresh()调用来更新虚拟屏幕。正常的refresh()呼叫只是noutrefresh(),后跟doupdate();如果必须更新多个窗口,则可以在所有窗口上发出noutrefresh()调用,然后再发出单个doupdate(),从而可以提高性能并减少屏幕闪烁。

Note

如果打开终端时发生错误,则底层的 curses 库可能会导致解释器退出。

垫类似于窗口,除了它不受屏幕尺寸的限制,并且不一定与屏幕的特定部分关联。当需要一个大窗口时,可以使用垫板,并且一次只将一部分窗口显示在屏幕上。不会自动刷新打击垫(例如,pass滚动或 Importing 的回声)。便笺簿的refresh()noutrefresh()方法需要 6 个参数来指定要显示的便笺簿的部分以及在屏幕上用于显示的位置。参数是* pminrow pmincol sminrow smincol smaxrow smaxcol *; * p 自变量是指要显示的焊盘区域的左上角,而 s *自变量定义了要在其中显示焊盘区域的屏幕上的剪切框。

默认情况下,窗口将从指定位置延伸到屏幕的右下角。

start_color()初始化八种基本颜色(黑色,红色,绿色,黄色,蓝色,洋红色,青色和白色),以及curses模块中的两个全局变量COLORSCOLOR_PAIRS,其中包含终端可以设置的最大颜色数和颜色对。支持。还将终端上的颜色恢复为刚打开终端时的颜色。

curses 库pass在更新屏幕时定期查找预先 Importing 来进行“行突破优化”。如果找到 Importing,并且它来自 tty,则将当前更新推迟到再次刷新或再次调用 doupdate 时,以更快地响应预先 Importing 的命令。此Function允许为预 Importing 检查指定其他文件 Descriptors。

Note

在调用getch()之前,只能按一个* ch *。

15.11.2. 窗口对象

如上面的initscr()newwin()返回的 Window 对象具有以下方法:

字符表示 C 字符(ASCII 代码),而不是 Python 字符(长度为 1 的字符串)。 (只要文档中提到字符,此 Comments 便是正确的.)内置的ord()便于将字符串传递给代码。

使用属性* attr (y, x)处绘制字符 ch *,覆盖先前在该位置绘制的任何字符。默认情况下,字符位置和属性是窗口对象的当前设置。

Note

在窗口,子窗口或便条纸外书写会引发curses.error。try在窗口,子窗口或填充区的右下角进行写入将导致在打印字符后引发异常。

Note

在窗口,子窗口或便条纸外书写会引发curses.error。try在窗口,子窗口或填充区的右下角进行写入将导致在打印字符串后引发异常。

Note

任何参数的0值都会使默认字符用于该参数。不能*使用关键字参数。下表列出了默认值:

Parameter Description Default value
ls Left side ACS_VLINE
rs Right side ACS_VLINE
ts Top ACS_HLINE
bs Bottom ACS_HLINE
tl Upper-left corner ACS_ULCORNER
tr Upper-right corner ACS_URCORNER
bl Bottom-left corner ACS_LLCORNER
br Bottom-right corner ACS_LRCORNER

如果* yes *为 0,则更新后光标将始终位于“光标位置”。

如果* yes *是0,则在几毫秒后,将不解释转义序列,并将其原样保留在 Importing 流中。

要获得对复制区域的细粒度控制,可以使用overlay()的第二种形式。 * sminrow smincol *是源窗口的左上坐标,其他变量在目标窗口中标记一个矩形。

要获得对复制区域的细粒度控制,可以使用overwrite()的第二种形式。 * sminrow smincol *是源窗口的左上坐标,其他变量在目标窗口中标记一个矩形。

仅当窗口是使用newpad()创建的填充板时才能指定 6 个可选参数。需要使用其他参数来指示涉及到触摸板和屏幕的哪个部分。 * pminrow pmincol *指定要在垫中显示的矩形的左上角。 * sminrow smincol smaxrow smaxcol *指定要在屏幕上显示的矩形的边缘。由于矩形的大小必须相同,因此要根据屏幕坐标计算要在垫中显示的矩形的右下角。两个矩形必须完全包含在它们各自的结构中。 * pminrow pmincol sminrow smincol *的负值被视为零。

默认情况下,子窗口将从指定位置延伸到窗口的右下角。

15.11.3. Constants

curses模块定义以下数据成员:

一些常量可用于指定字符单元格属性。可用的确切常数取决于系统。

Attribute Meaning
A_ALTCHARSET 备用字符集模式
A_BLINK Blink mode
A_BOLD Bold mode
A_DIM Dim mode
A_INVIS 不可见或空白模式
A_NORMAL Normal attribute
A_PROTECT Protected mode
A_REVERSE 反转背景和前景色
A_STANDOUT Standout mode
A_UNDERLINE Underline mode
A_HORIZONTAL Horizontal highlight
A_LEFT Left highlight
A_LOW Low highlight
A_RIGHT Right highlight
A_TOP Top highlight
A_VERTICAL Vertical highlight
A_CHARTEXT 位掩码以提取字符

有几个常量可用于提取某些方法返回的相应属性。

Bit-mask Meaning
A_ATTRIBUTES 位掩码以提取属性
A_CHARTEXT 位掩码以提取字符
A_COLOR 位掩码以提取颜色对字段信息

键由名称以KEY_开头的整数常量引用。可用的确切键帽取决于系统。

Key constant Key
KEY_MIN 最小键值
KEY_BREAK 断码(不可靠)
KEY_DOWN Down-arrow
KEY_UP Up-arrow
KEY_LEFT Left-arrow
KEY_RIGHT Right-arrow
KEY_HOME Home 键(向左箭头)
KEY_BACKSPACE Backspace (unreliable)
KEY_F0 Function键。最多支持 64 个Function键。
KEY_Fn Function键的值* n *
KEY_DL Delete line
KEY_IL Insert line
KEY_DC Delete character
KEY_IC 插入字符或进入插入模式
KEY_EIC 退出插入字符模式
KEY_CLEAR Clear screen
KEY_EOS 清除到屏幕末尾
KEY_EOL 清除到行尾
KEY_SF 向前滚动 1 行
KEY_SR 向后滚动 1 行(反向)
KEY_NPAGE Next page
KEY_PPAGE Previous page
KEY_STAB Set tab
KEY_CTAB Clear tab
KEY_CATAB 清除所有标签
KEY_ENTER Importing 或发送(不可靠)
KEY_SRESET 软(部分)重置(不可靠)
KEY_RESET 重置或硬重置(不可靠)
KEY_PRINT Print
KEY_LL 下或下(左下)
KEY_A1 键盘左上方
KEY_A3 键盘右上方
KEY_B2 键盘中心
KEY_C1 键盘左下
KEY_C3 键盘右下角
KEY_BTAB Back tab
KEY_BEG Beg (beginning)
KEY_CANCEL Cancel
KEY_CLOSE Close
KEY_COMMAND Cmd (command)
KEY_COPY Copy
KEY_CREATE Create
KEY_END End
KEY_EXIT Exit
KEY_FIND Find
KEY_HELP Help
KEY_MARK Mark
KEY_MESSAGE Message
KEY_MOVE Move
KEY_NEXT Next
KEY_OPEN Open
KEY_OPTIONS Options
KEY_PREVIOUS Prev (previous)
KEY_REDO Redo
KEY_REFERENCE Ref (reference)
KEY_REFRESH Refresh
KEY_REPLACE Replace
KEY_RESTART Restart
KEY_RESUME Resume
KEY_SAVE Save
KEY_SBEG 转移乞求(开始)
KEY_SCANCEL Shifted Cancel
KEY_SCOMMAND Shifted Command
KEY_SCOPY Shifted Copy
KEY_SCREATE Shifted Create
KEY_SDC 移位删除字符
KEY_SDL 删除线移动
KEY_SELECT Select
KEY_SEND Shifted End
KEY_SEOL 移位清除线
KEY_SEXIT Shifted Exit
KEY_SFIND Shifted Find
KEY_SHELP Shifted Help
KEY_SHOME Shifted Home
KEY_SIC Shifted Input
KEY_SLEFT 左移箭头
KEY_SMESSAGE Shifted Message
KEY_SMOVE Shifted Move
KEY_SNEXT Shifted Next
KEY_SOPTIONS Shifted Options
KEY_SPREVIOUS Shifted Prev
KEY_SPRINT Shifted Print
KEY_SREDO Shifted Redo
KEY_SREPLACE Shifted Replace
KEY_SRIGHT 右移箭头
KEY_SRSUME Shifted Resume
KEY_SSAVE Shifted Save
KEY_SSUSPEND Shifted Suspend
KEY_SUNDO Shifted Undo
KEY_SUSPEND Suspend
KEY_UNDO Undo
KEY_MOUSE 发生鼠标事件
KEY_RESIZE 终端调整大小事件
KEY_MAX 最大键值

在 VT100 及其软件仿真(例如 X 终端仿真器)上,通常至少有四个Function键(KEY_F1KEY_F2KEY_F3KEY_F4)可用,并且箭头键以明显的方式 Map 到KEY_UPKEY_DOWNKEY_LEFTKEY_RIGHT。如果您的计算机具有 PC 键盘,则可以安全地使用箭头键和十二个Function键(较旧的 PC 键盘可能只有十个Function键);此外,以下键盘 Map 是标准的:

Keycap Constant
Insert KEY_IC
Delete KEY_DC
Home KEY_HOME
End KEY_END
Page Up KEY_PPAGE
Page Down KEY_NPAGE

下表列出了备用字符集中的字符。这些是从 VT100 终端继承的,通常可在软件仿真(例如 X 终端)上使用。如果没有可用的图形,则 curses 会退回到粗略的可打印 ASCII 近似值上。

Note

这些仅在调用initscr()后可用。

ACS code Meaning
ACS_BBSS 右上角的备用名称
ACS_BLOCK 实心方块
ACS_BOARD 正方形板
ACS_BSBS 水平线的备用名称
ACS_BSSB 左上角的备用名称
ACS_BSSS 三通的替代名称
ACS_BTEE bottom tee
ACS_BULLET bullet
ACS_CKBOARD 棋盘(点画)
ACS_DARROW 向下的箭头
ACS_DEGREE degree symbol
ACS_DIAMOND diamond
ACS_GEQUAL greater-than-or-equal-to
ACS_HLINE horizontal line
ACS_LANTERN lantern symbol
ACS_LARROW left arrow
ACS_LEQUAL less-than-or-equal-to
ACS_LLCORNER 左下角
ACS_LRCORNER 右下角
ACS_LTEE left tee
ACS_NEQUAL not-equal sign
ACS_PI letter pi
ACS_PLMINUS plus-or-minus sign
ACS_PLUS 大加号
ACS_RARROW right arrow
ACS_RTEE right tee
ACS_S1 扫描线 1
ACS_S3 扫描线 3
ACS_S7 扫描第 7 行
ACS_S9 扫描线 9
ACS_SBBS 右下角的备用名称
ACS_SBSB 垂直线的备用名称
ACS_SBSS 右三通的替代名称
ACS_SSBB 左下角的备用名称
ACS_SSBS 三通的替代名称
ACS_SSSB 左三通的替代名称
ACS_SSSS 分频器或大加号的替代名称
ACS_STERLING pound sterling
ACS_TTEE top tee
ACS_UARROW up arrow
ACS_ULCORNER 左上角
ACS_URCORNER 右上角
ACS_VLINE vertical line

下表列出了 sched 义的颜色:

Constant Color
COLOR_BLACK Black
COLOR_BLUE Blue
COLOR_CYAN 青色(浅绿色蓝色)
COLOR_GREEN Green
COLOR_MAGENTA 洋红色(紫红色)
COLOR_RED Red
COLOR_WHITE White
COLOR_YELLOW Yellow

15.12. curses.textpad — curses 程序的文本 Importing 小部件

1.6 版中的新Function。

curses.textpad模块提供了一个Textbox类,该类可在 curses 窗口中处理基本文本编辑,并支持类似于 Emacs 的一组键绑定(因此也包含 Netscape Navigator,BBedit 6.x,FrameMaker 和许多其他程序)。该模块还提供了矩形绘图Function,可用于为文本框定框或用于其他目的。

curses.textpad模块定义以下Function:

15.12.1. Literals 框对象

您可以实例化一个Textbox对象,如下所示:

Textbox对象具有以下方法:

Keystroke Action
Control-A 转到窗口的左边缘。
Control-B 向左移动光标,并在适当的情况下换行到上一行。
Control-D 删除光标下的字符。
Control-E 转到右边缘(Stripspaces 关闭)或行尾(Stripspaces 打开)。
Control-F 向右光标,在适当的时候换行到下一行。
Control-G 终止,返回窗口内容。
Control-H 向后删除字符。
Control-J 如果窗口是 1 行,则终止,否则插入换行符。
Control-K 如果行为空,请将其删除,否则清除到行尾。
Control-L Refresh screen.
Control-N 光标向下;向下移动一行。
Control-O 在光标位置插入空白行。
Control-P 光标向上;向上移动一行。

如果光标位于无法移动的边缘,则移动操作不会执行任何操作。在可能的情况下支持以下同义词:

Constant Keystroke
KEY_LEFT Control-B
KEY_RIGHT Control-F
KEY_UP Control-P
KEY_DOWN Control-N
KEY_BACKSPACE Control-h

其他所有击键均视为插入给定字符并向右移动(带有换行符)的命令。

首页