15.11. curses — 字符单元显示的终端处理 — Python 文档
15.11. 诅咒 — 字符单元显示的终端处理
1.6 版更改: 添加了对 ncurses
库的支持并转换为包。
curses 模块提供了一个到curses 库的接口,curses 库是便携式高级终端处理的事实上的标准。
虽然curses 在Unix 环境中使用最为广泛,但也有适用于DOS、OS/2 和其他系统的版本。 该扩展模块旨在匹配 ncurses 的 API,这是一个托管在 Linux 上的开源 Curses 库和 Unix 的 BSD 变体。
笔记
从 5.4 版开始,ncurses 库决定如何使用 nl_langinfo
函数解释非 ASCII 数据。 这意味着您必须在应用程序中调用 locale.setlocale() 并使用系统可用的编码之一对 Unicode 字符串进行编码。 此示例使用系统的默认编码:
import locale
locale.setlocale(locale.LC_ALL, '')
code = locale.getpreferredencoding()
然后使用 code 作为 str.encode() 调用的编码。
也可以看看
- 模块 curses.ascii
- 用于处理 ASCII 字符的实用程序,无论您的区域设置如何。
- 模块 curses.panel
- 一个面板集扩展,增加了诅咒窗口的深度。
- 模块 curses.textpad
- 支持 Emacs 类绑定的用于诅咒的可编辑文本小部件。
- 使用 Python 进行 Curses 编程
- 关于在 Python 中使用 Curses 的教程材料,作者为 Andrew Kuchling 和 Eric Raymond。
Python 源代码分发中的 :source:`Demo/curses/` 目录包含一些使用该模块提供的curses 绑定的示例程序。
15.11.1. 职能
模块 curses 定义了以下异常:
- exception curses.error
- 当 curses 库函数返回错误时引发异常。
笔记
当函数或方法的 x 或 y 参数是可选的时,它们默认为当前光标位置。 当 attr 是可选的时,它默认为 A_NORMAL
。
模块 curses 定义了以下函数:
- curses.baudrate()
- 以每秒位数为单位返回终端的输出速度。 在软件终端模拟器上,它将具有固定的高值。 由于历史原因包括在内; 以前,它用于编写输出循环以实现时间延迟,有时还用于根据线路速度更改接口。
- curses.beep()
- 发出短暂的注意声。
- curses.can_change_color()
- 返回
True
或False
,取决于程序员是否可以改变终端显示的颜色。
- curses.cbreak()
- 进入 cbreak 模式。 在 cbreak 模式(有时称为“稀有”模式)下,正常的 tty 行缓冲被关闭,字符可以一个一个地读取。 但是,与原始模式不同,特殊字符(中断、退出、挂起和流控制)保留其对 tty 驱动程序和调用程序的影响。 首先调用 raw() 然后 cbreak() 使终端处于 cbreak 模式。
- curses.color_content(color_number)
- 返回颜色 color_number 中红色、绿色和蓝色 (RGB) 分量的强度,该颜色必须介于
0
和COLORS
之间。 返回一个 3 元组,包含给定颜色的 R、G、B 值,该值介于0
(无分量)和1000
(最大分量)之间。
- curses.color_pair(color_number)
- 返回以指定颜色显示文本的属性值。 该属性值可以与
A_STANDOUT
、A_REVERSE
和其他A_*
属性组合。 pair_number() 是这个函数的对应物。
- curses.curs_set(visibility)
- 设置光标状态。 visibility 可以设置为 0、1 或 2,表示不可见、正常或非常可见。 如果终端支持请求的可见性,则返回之前的光标状态; 否则,将引发异常。 在许多终端上,“可见”模式是下划线光标,“非常可见”模式是块光标。
- curses.def_prog_mode()
- 将当前终端模式保存为“程序”模式,即运行程序使用curses时的模式。 (它的对应物是“shell”模式,当程序不在curses 中时。)随后调用reset_prog_mode() 将恢复此模式。
- curses.def_shell_mode()
- 将当前终端模式保存为“shell”模式,即运行程序未使用curses时的模式。 (它的对应物是“程序”模式,当程序使用curses 功能时。)对reset_shell_mode() 的后续调用将恢复该模式。
- curses.delay_output(ms)
- 在输出中插入 ms 毫秒暂停。
- curses.doupdate()
更新物理屏幕。 curses 库保留两种数据结构,一种表示当前物理屏幕内容,另一种表示所需的下一个状态的虚拟屏幕。 doupdate() 地面更新物理屏幕以匹配虚拟屏幕。
在窗口上执行了诸如
addstr()
之类的写操作后,可以通过noutrefresh()
调用来更新虚拟屏幕。 正常的refresh()
调用只是noutrefresh()
后跟 doupdate(); 如果您必须更新多个窗口,您可以通过在所有窗口上发出noutrefresh()
调用,然后是单个 doupdate() 来提高性能并可能减少屏幕闪烁。
- curses.echo()
- 进入回声模式。 在回显模式下,每个字符输入都会在输入时回显到屏幕上。
- curses.endwin()
- 取消初始化库,并使终端恢复正常状态。
- curses.erasechar()
- 返回用户当前的擦除字符。 在Unix 操作系统下,这是curses 程序的控制tty 的一个属性,并且不是由curses 库本身设置的。
- curses.filter()
- filter() 例程(如果使用)必须在调用 initscr() 之前调用。 效果是,在这些调用期间,
LINES
设置为 1; 功能 clear、cup、cud、cud1、cuu1、cuu、vpa 被禁用; 并且 home 字符串设置为 cr 的值。 效果是光标被限制在当前行,屏幕更新也是如此。 这可用于启用逐个字符的行编辑,而无需触摸屏幕的其余部分。
- curses.flash()
- 闪屏。 即,将其更改为反向视频,然后在很短的间隔内将其更改回来。 有些人更喜欢“可见铃铛”,而不是由 beep() 产生的听觉注意信号。
- curses.flushinp()
- 刷新所有输入缓冲区。 这会丢弃用户已输入但程序尚未处理的任何预先输入。
- curses.getmouse()
- 在
getch()
返回KEY_MOUSE
以发出鼠标事件信号后,应调用此方法以检索排队的鼠标事件,表示为 5 元组(id, x, y, z, bstate)
。 id是用于区分多个设备的ID值,x、y、z是事件的坐标。 (z 当前未使用。) bstate 是一个整数值,其位将被设置以指示事件的类型,并将是以下一个或多个常量的按位或,其中 n 是从 1 到 4 的按钮编号:BUTTONn_PRESSED
、BUTTONn_RELEASED
、BUTTONn_CLICKED
、BUTTONn_DOUBLE_CLICKED
、[ X303X]、BUTTON_SHIFT
、BUTTON_CTRL
、BUTTON_ALT
。
- curses.getsyx()
- 返回虚拟屏幕光标在 y 和 x 中的当前坐标。 如果 leaveok 当前为真,则返回 -1,-1。
- curses.getwin(file)
- 通过较早的
putwin()
调用读取文件中存储的窗口相关数据。 然后该例程使用该数据创建并初始化一个新窗口,返回新窗口对象。
- curses.has_colors()
- 如果终端可以显示颜色,则返回
True
; 否则,返回False
。
- curses.has_ic()
- 如果终端具有插入和删除字符功能,则返回
True
。 仅出于历史原因才包含此功能,因为所有现代软件终端仿真器都具有此类功能。
- curses.has_il()
- 如果终端具有插入和删除行功能,或者可以使用滚动区域模拟它们,则返回
True
。 仅出于历史原因才包含此功能,因为所有现代软件终端仿真器都具有此类功能。
- curses.has_key(ch)
- 取一个键值 ch,如果当前终端类型识别出具有该值的键,则返回
True
。
- curses.halfdelay(tenths)
- 用于半延迟模式,它类似于 cbreak 模式,因为用户键入的字符立即可供程序使用。 但是,在阻塞 tenths 十分之一秒后,如果没有输入任何内容,则会引发异常。 tenths 的值必须是
1
和255
之间的数字。 使用 nocbreak() 退出半延迟模式。
- curses.init_color(color_number, r, g, b)
- 更改颜色的定义,取要更改的颜色编号,后跟三个 RGB 值(用于红色、绿色和蓝色分量的数量)。 color_number 的值必须在
0
和COLORS
之间。 r、g、b中的每一个都必须是0
和1000
之间的值。 当使用 init_color() 时,屏幕上所有出现的颜色都会立即更改为新定义。 此功能在大多数终端上是无操作的; 仅当 can_change_color() 返回1
时它才处于活动状态。
- curses.init_pair(pair_number, fg, bg)
- 更改颜色对的定义。 它需要三个参数:要更改的颜色对的编号、前景色编号和背景色编号。 pair_number 的值必须在
1
和COLOR_PAIRS - 1
之间(0
颜色对连接到黑底白字,不能更改)。 fg 和 bg 参数的值必须在0
和COLORS
之间。 如果先前已初始化颜色对,则刷新屏幕并将该颜色对的所有出现更改为新定义。
- curses.initscr()
初始化库。 返回代表整个屏幕的
WindowObject
。笔记
如果打开终端出错,底层的curses 库可能会导致解释器退出。
- curses.is_term_resized(nlines, ncols)
- 如果 resize_term() 将修改窗口结构,则返回
True
,否则返回False
。
- curses.isendwin()
- 如果 endwin() 已被调用(即,curses 库已被取消初始化),则返回
True
。
- curses.keyname(k)
- 返回编号为 k 的键的名称。 生成可打印 ASCII 字符的密钥的名称是密钥的字符。 控制键组合的名称是一个由插入符号后跟相应的可打印 ASCII 字符组成的两个字符的字符串。 alt 键组合 (128–255) 的名称是一个字符串,由前缀“M-”后跟相应 ASCII 字符的名称组成。
- curses.killchar()
- 返回用户的当前行终止字符。 在Unix 操作系统下,这是curses 程序的控制tty 的一个属性,并且不是由curses 库本身设置的。
- curses.longname()
- 返回一个包含描述当前终端的 terminfo 长名称字段的字符串。 详细描述的最大长度为 128 个字符。 它仅在调用 initscr() 之后定义。
- curses.meta(yes)
- 如果yes为1,则允许输入8位字符。 如果 yes 为 0,则仅允许 7 位字符。
- curses.mouseinterval(interval)
- 设置按下和释放事件之间可以经过的最大时间(以毫秒为单位),以便将它们识别为单击,并返回前一个间隔值。 默认值为 200 毫秒,即五分之一秒。
- curses.mousemask(mousemask)
- 设置要上报的鼠标事件,并返回一个元组
(availmask, oldmask)
。 availmask表示可以上报哪些指定的鼠标事件; 完全失败时返回 0。 oldmask 是给定窗口鼠标事件掩码的前一个值。 如果从未调用此函数,则不会报告任何鼠标事件。
- curses.napms(ms)
- 休眠 ms 毫秒。
- curses.newpad(nlines, ncols)
创建并返回一个指向具有给定行数和列数的新填充数据结构的指针。 垫作为窗口对象返回。
pad 就像一个窗口,只是它不受屏幕大小的限制,并且不一定与屏幕的特定部分相关联。 当需要一个大窗口时可以使用Pads,并且一次只有一部分窗口会出现在屏幕上。 不会发生 pad 的自动刷新(例如滚动或回显输入)。 打击垫的
refresh()
和noutrefresh()
方法需要 6 个参数来指定要显示的打击垫部分以及要用于显示的屏幕位置。 参数是 pminrow、pmincol、sminrow、smincol、smaxrow、s9Xcol ; p 参数指的是要显示的焊盘区域的左上角,而 s 参数定义了屏幕上要显示焊盘区域的剪切框。
- curses.newwin(nlines, ncols)
curses.newwin(nlines, ncols, begin_y, begin_x) 返回一个新窗口,其左上角在
(begin_y, begin_x)
,高度/宽度为 nlines/ncols。默认情况下,窗口将从指定位置延伸到屏幕的右下角。
- curses.nl()
- 进入换行模式。 此模式在输入时将返回键转换为换行符,并在输出时将换行符转换为返回和换行符。 换行模式最初是打开的。
- curses.nocbreak()
- 离开 cbreak 模式。 使用行缓冲返回到正常的“cooked”模式。
- curses.noecho()
- 离开回声模式。 输入字符的回显被关闭。
- curses.nonl()
- 离开换行模式。 在输入时禁用返回到换行符的转换,并在输出时禁用将换行符转换为换行符/返回的低级转换(但这不会改变
addch('\n')
的行为,它总是等效于返回和换行虚拟屏幕)。 关闭平移后,curses 有时会稍微加快垂直运动; 此外,它还能够检测输入时的返回键。
- curses.noqiflush()
- 当使用 noqiflush() 例程时,与 INTR、QUIT 和 SUSP 字符关联的输入和输出队列的正常刷新将不会进行。 如果您希望在信号处理程序退出后继续输出就好像中断没有发生一样,您可能需要在信号处理程序中调用 noqiflush()。
- curses.noraw()
- 离开原始模式。 使用行缓冲返回到正常的“cooked”模式。
- curses.pair_content(pair_number)
- 返回包含所请求颜色对的颜色的元组
(fg, bg)
。 pair_number 的值必须在1
和COLOR_PAIRS - 1
之间。
- curses.pair_number(attr)
- 返回由属性值 attr 设置的颜色对的编号。 color_pair() 是这个函数的对应物。
- curses.putp(string)
- 相当于
tputs(str, 1, putchar)
; 为当前终端发出指定 terminfo 能力的值。 请注意, putp() 的输出总是进入标准输出。
- curses.qiflush([flag])
- 如果flag为
False
,效果与调用noqiflush()相同。 如果 flag 是True
,或者没有提供参数,则读取这些控制字符时将刷新队列。
- curses.raw()
- 进入原始模式。 原始模式下,正常的行缓冲和中断、退出、挂起、流控键的处理被关闭; 字符被一一呈现给curses输入函数。
- curses.reset_prog_mode()
- 将终端恢复到“编程”模式,如之前由 def_prog_mode() 保存的那样。
- curses.reset_shell_mode()
- 将终端恢复到“shell”模式,如之前由 def_shell_mode() 保存的那样。
- curses.resetty()
- 将终端模式的状态恢复到上次调用 savetty() 时的状态。
- curses.resize_term(nlines, ncols)
- resizeterm()使用的后端函数,执行大部分工作; 调整窗口大小时,resize_term() 空白填充扩展的区域。 调用应用程序应使用适当的数据填充这些区域。 resize_term() 函数尝试调整所有窗口的大小。 但是,由于 pads 的调用约定,如果不与应用程序进行额外的交互,则无法调整它们的大小。
- curses.resizeterm(nlines, ncols)
- 将标准窗口和当前窗口的大小调整为指定的尺寸,并调整curses 库使用的记录窗口尺寸的其他簿记数据(特别是SIGWINCH 处理程序)。
- curses.savetty()
- 将终端模式的当前状态保存在缓冲区中,可由 resetty() 使用。
- curses.setsyx(y, x)
- 将虚拟屏幕光标设置为y、x。 如果 y 和 x 都为 -1,则设置 leaveok。
- curses.setupterm([termstr, fd])
- 初始化终端。 termstr 是一个给出终端名称的字符串; 如果省略,将使用
TERM
环境变量的值。 fd 是任何初始化序列将被发送到的文件描述符; 如果未提供,将使用sys.stdout
的文件描述符。
- curses.start_color()
如果程序员想要使用颜色,必须在调用任何其他颜色操作例程之前调用。 最好在 initscr() 之后立即调用此例程。
start_color()初始化八种基本颜色(黑、红、绿、黄、蓝、品红、青、白),以及curses模块中的两个全局变量,
COLORS
和COLOR_PAIRS
,包含终端可以支持的最大颜色和颜色对数。 它还会将终端上的颜色恢复为刚打开终端时的颜色。
- curses.termattrs()
- 返回终端支持的所有视频属性的逻辑 OR。 当curses 程序需要完全控制屏幕外观时,此信息很有用。
- curses.termname()
- 返回环境变量
TERM
的值,截断为 14 个字符。
- curses.tigetflag(capname)
- 返回与 terminfo 能力名称 capname 对应的布尔能力的值。 如果 capname 不是布尔能力,则返回值
-1
,如果终端描述中取消或不存在0
,则返回值。
- curses.tigetnum(capname)
- 返回与 terminfo 能力名称 capname 对应的数字能力的值。 如果 capname 不是数字能力,则返回值
-2
,如果终端描述中取消或不存在-1
,则返回值。
- curses.tigetstr(capname)
- 返回 terminfo 能力名称 capname 对应的字符串能力的值。
None
。
- curses.tparm(str[, ...])
- 使用提供的参数实例化字符串 str,其中 str 应该是从 terminfo 数据库获得的参数化字符串。 例如
tparm(tigetstr("cup"), 5, 3)
可能导致'\033[6;4H'
,具体结果取决于终端类型。
- curses.typeahead(fd)
指定文件描述符 fd 用于预输入检查。 如果 fd 是
-1
,则不进行预输入检查。curses 库通过在更新屏幕时定期查找提前输入来进行“换行优化”。 如果找到输入,并且它来自 tty,则当前更新将被推迟,直到再次调用 refresh 或 doupdate,从而可以更快地响应预先键入的命令。 此函数允许指定不同的文件描述符以进行预输入检查。
- curses.unctrl(ch)
- 返回一个字符串,它是字符 ch 的可打印表示。 控制字符显示为插入符号后跟字符,例如
^C
。 打印字符保持原样。
- curses.ungetch(ch)
按 ch 以便下一个
getch()
将返回它。笔记
在调用
getch()
之前,只能推送一个ch。
- curses.ungetmouse(id, x, y, z, bstate)
- 将
KEY_MOUSE
事件推送到输入队列,将给定的状态数据与其关联。
- curses.use_env(flag)
- 如果使用,应在调用 initscr() 或 newterm 之前调用此函数。 当 flag 为
False
时,将使用 terminfo 数据库中指定的行和列的值,即使环境变量LINES
和 ]COLUMNS
(默认使用)被设置,或者如果curses在一个窗口中运行(在这种情况下默认行为是使用窗口大小,如果[ X329X] 和COLUMNS
未设置)。
- curses.use_default_colors()
- 允许在支持此功能的终端上使用颜色的默认值。 使用它来支持应用程序的透明度。 默认颜色分配给颜色编号 -1。 调用此函数后,
init_pair(x, curses.COLOR_RED, -1)
将例如颜色对 x 初始化为默认背景上的红色前景色。
- curses.wrapper(func, ...)
- 初始化curses 并调用另一个可调用对象func,它应该是您使用curses 的应用程序的其余部分。 如果应用程序引发异常,此函数将在重新引发异常并生成回溯之前将终端恢复到正常状态。 然后将可调用对象 func 作为它的第一个参数传递给主窗口 'stdscr',然后是传递给 wrapper() 的任何其他参数。 在调用 func 之前,wrapper() 打开 cbreak 模式,关闭 echo,启用终端键盘,如果终端支持颜色,则初始化颜色。 在退出时(无论是正常情况还是例外情况),它会恢复煮熟模式,打开回声,并禁用终端键盘。
15.11.2. 窗口对象
由上面的 initscr() 和 newwin() 返回的窗口对象具有以下方法:
- window.addch(ch[, attr])
window.addch(y, x, ch[, attr]) 笔记
character 表示 C 字符(ASCII 码),而不是 Python 字符(长度为 1 的字符串)。 (当文档提到一个字符时,这个注释是正确的。)内置的 ord() 可以方便地将字符串传递给代码。
使用属性 attr 在
(y, x)
处绘制角色 ch,覆盖之前在该位置绘制的任何角色。 默认情况下,字符位置和属性是窗口对象的当前设置。笔记
在窗口、子窗口或垫外写入会引发 curses.error。 尝试写入窗口、子窗口或垫的右下角将导致在打印字符后引发异常。
- window.addnstr(str, n[, attr])
window.addnstr(y, x, str, n[, attr])
- 在
(y, x)
处使用属性 attr 最多绘制字符串 str 的 n 个字符,覆盖之前显示的任何内容。
- window.addstr(str[, attr])
window.addstr(y, x, str[, attr]) 使用属性 attr 在
(y, x)
处绘制字符串 str,覆盖之前显示的任何内容。笔记
在窗口、子窗口或垫外写入会引发 curses.error。 尝试写入窗口、子窗口或垫的右下角将导致在打印字符串后引发异常。
- window.attroff(attr)
- 从应用于所有写入当前窗口的“背景”集中移除属性 attr。
- window.attron(attr)
- 添加属性 attr 从应用到当前窗口的所有写入的“背景”集中。
- window.attrset(attr)
- 将“背景”属性集设置为 attr。 该集合最初为 0(无属性)。
- window.bkgd(ch[, attr])
- 设置窗口的背景属性为字符ch,属性为attr。 然后将更改应用于该窗口中的每个字符位置:
- 窗口中每个字符的属性都更改为新的背景属性。
- 无论以前的背景字符出现在何处,它都会更改为新的背景字符。
- window.bkgdset(ch[, attr])
- 设置窗口的背景。 窗口的背景由字符和属性的任意组合组成。 背景的属性部分与写入窗口的所有非空白字符组合(或运算)。 背景的字符和属性部分都与空白字符组合。 背景成为字符的属性,并通过任何滚动和插入/删除行/字符操作与字符一起移动。
- window.border([ls[, rs[, ts[, bs[, tl[, tr[, bl[, br]]]]]]]])
围绕窗口边缘绘制边框。 每个参数指定用于边框特定部分的字符; 有关详细信息,请参阅下表。 字符可以指定为整数或单字符字符串。
笔记
任何参数的
0
值都会导致该参数使用默认字符。 关键字参数可以 不能使用 。 下表中列出了默认值:参数
说明
默认值
ls
左侧
ACS_VLINE
rs
右侧
ACS_VLINE
ts
顶部
ACS_HLINE
bs
底部
ACS_HLINE
tl
左上角
ACS_ULCORNER
tr
右上角
ACS_URCORNER
BL
左下角
ACS_LLCORNER
br
右下角
ACS_LRCORNER
- window.box([vertch, horch])
- 类似于 border(),但 ls 和 rs 都是 vertch 并且都是 ts 和 bs 是 horch。 此函数始终使用默认角字符。
- window.chgat(attr)
window.chgat(num, attr)
window.chgat(y, x, attr)
window.chgat(y, x, num, attr)
- 在当前光标位置设置 num 个字符的属性,或者在位置
(y, x)
(如果提供)。 如果没有给出 num 或者是-1
,则属性将设置在所有字符上到行尾。 如果提供,此功能将光标移动到位置(y, x)
。 将使用 touchline() 方法触摸更改的行,以便下次窗口刷新时重新显示内容。
- window.clearok(yes)
- 如果 yes 为 1,则下次调用 refresh() 将完全清除窗口。
- window.clrtobot()
- Erase from cursor to the end of the window:删除光标下的所有行,然后执行clrtoeol()等价的操作。
- window.clrtoeol()
- 擦除从光标到行尾。
- window.cursyncup()
- 更新窗口所有祖先的当前光标位置以反映窗口的当前光标位置。
- window.delch([y, x])
- 删除
(y, x)
处的任何字符。
- window.deleteln()
- 删除光标下的行。 以下所有行都向上移动一行。
- window.derwin(begin_y, begin_x)
window.derwin(nlines, ncols, begin_y, begin_x)
- window.echochar(ch[, attr])
- 添加属性为attr的字符ch,并立即在窗口上调用refresh()。
- window.enclose(y, x)
- 测试给定的相对于屏幕的字符单元坐标对是否被给定的窗口包围,返回
True
或False
。 这对于确定屏幕窗口的哪个子集包含鼠标事件的位置很有用。
- window.erase()
- 清空窗户。
- window.getbegyx()
- 返回左上角坐标的元组
(y, x)
。
- window.getbkgd()
- 返回给定窗口的当前背景字符/属性对。
- window.getch([y, x])
- 得到一个字符。 请注意,返回的整数 不是 必须在 ASCII 范围内:功能键、键盘键等返回大于 256 的数字。 在无延迟模式下,如果没有输入则返回 -1,否则 getch() 等待直到按下某个键。
- window.getkey([y, x])
- 获取一个字符,返回一个字符串而不是一个整数,就像 getch() 所做的那样。 功能键、键盘键等返回一个包含键名的多字节字符串。 在无延迟模式下,如果没有输入,则会引发异常。
- window.getmaxyx()
- 返回窗口高度和宽度的元组
(y, x)
。
- window.getparyx()
- 将此窗口相对于其父窗口的起始坐标返回到两个整数变量 y 和 x 中。 如果此窗口没有父窗口,则返回
-1, -1
。
- window.getstr([y, x])
- 从用户处读取一个字符串,具有原始的行编辑能力。
- window.getyx()
- 返回当前光标位置相对于窗口左上角的元组
(y, x)
。
- window.hline(ch, n)
window.hline(y, x, ch, n)
- 显示一条从
(y, x)
开始、长度为 n 的水平线,由字符 ch 组成。
- window.idcok(flag)
- 如果flag为
False
,curses不再考虑使用终端的硬件插入/删除字符特性; 如果 flag 是True
,则启用字符插入和删除的使用。 首次初始化curses 时,默认启用字符插入/删除。
- window.idlok(yes)
- 如果调用时 yes 等于 1,则 curses 将尝试使用硬件行编辑工具。 否则,行插入/删除将被禁用。
- window.immedok(flag)
- 如果flag为
True
,窗口图像的任何变化都会自动导致窗口刷新; 您不再需要自己调用 refresh()。 但是,由于重复调用 wrefresh,它可能会显着降低性能。 默认情况下禁用此选项。
- window.inch([y, x])
- 返回窗口中给定位置的字符。 低 8 位是字符本身,高位是属性。
- window.insch(ch[, attr])
window.insch(y, x, ch[, attr])
- 在
(y, x)
处使用属性 attr 绘制字符 ch,将线从位置 x 向右移动一个字符。
- window.insdelln(nlines)
- 在当前行上方的指定窗口中插入 nlines 行。 nlines 底线丢失。 对于负的 nlines,删除从光标下的行开始的 nlines 行,并将剩余的行向上移动。 底部的 nlines 行被清除。 当前光标位置保持不变。
- window.insertln()
- 在光标下插入一个空行。 以下所有行都向下移动一行。
- window.insnstr(str, n[, attr])
window.insnstr(y, x, str, n[, attr])
- 在光标下的字符前插入一个字符串(一行中可以容纳的字符数),最多为 n 个字符。 如果 n 为零或负数,则插入整个字符串。 光标右侧的所有字符都向右移动,行上最右侧的字符将丢失。 光标位置不变(移动到 y、x,如果指定的话)。
- window.insstr(str[, attr])
window.insstr(y, x, str[, attr])
- 在光标下的字符之前插入一个字符串(尽可能多的字符)。 光标右侧的所有字符都向右移动,行上最右侧的字符将丢失。 光标位置不变(移动到 y、x,如果指定的话)。
- window.instr([n])
window.instr(y, x[, n])
- 返回从当前光标位置开始的窗口中提取的字符串,或者从 y、x(如果指定)处提取。 属性从字符中剥离。 如果指定了 n,则 instr() 返回最多 n 个字符长的字符串(不包括尾随的 NUL)。
- window.is_linetouched(line)
- 如果指定行自上次调用 refresh() 后被修改,则返回
True
; 否则返回False
。 如果 line 对给定窗口无效,则引发 curses.error 异常。
- window.is_wintouched()
- 如果指定的窗口自上次调用 refresh() 后被修改,则返回
True
; 否则返回False
。
- window.keypad(yes)
- 如果 yes 为 1,某些键(键盘、功能键)生成的转义序列将由 curses 解释。 如果 yes 为 0,则转义序列将保留在输入流中。
- window.leaveok(yes)
如果 yes 为 1,光标将留在更新时的位置,而不是在“光标位置”。 这会在可能的情况下减少光标移动。 如果可能,光标将不可见。
如果 yes 为 0,则更新后光标将始终位于“光标位置”。
- window.move(new_y, new_x)
- 将光标移动到
(new_y, new_x)
。
- window.mvderwin(y, x)
- 将窗口移动到其父窗口内。 窗口的屏幕相关参数不会改变。 该例程用于在屏幕上的相同物理位置显示父窗口的不同部分。
- window.mvwin(new_y, new_x)
- 移动窗口使其左上角位于
(new_y, new_x)
。
- window.nodelay(yes)
- 如果 yes 是
1
,则 getch() 将是非阻塞的。
- window.notimeout(yes)
如果 yes 是
1
,转义序列不会超时。如果 yes 是
0
,几毫秒后,转义序列将不会被解释,并将原样留在输入流中。
- window.noutrefresh()
- 标记刷新但等待。 此函数更新表示窗口所需状态的数据结构,但不强制更新物理屏幕。 为此,请调用 doupdate()。
- window.overlay(destwin[, sminrow, smincol, dminrow, dmincol, dmaxrow, dmaxcol])
将窗口覆盖在 destwin 的顶部。 窗口大小不必相同,只复制重叠区域。 此副本是非破坏性的,这意味着当前背景字符不会覆盖 destwin 的旧内容。
要对复制区域进行细粒度控制,可以使用 overlay() 的第二种形式。 sminrow 和 smincol 是源窗口的左上角坐标,其他变量标记目标窗口中的一个矩形。
- window.overwrite(destwin[, sminrow, smincol, dminrow, dmincol, dmaxrow, dmaxcol])
覆盖 destwin 顶部的窗口。 窗口大小不必相同,在这种情况下,只复制重叠区域。 这个副本是破坏性的,这意味着当前背景字符覆盖了destwin的旧内容。
要对复制区域进行细粒度控制,可以使用 overwrite() 的第二种形式。 sminrow 和 smincol 是源窗口的左上角坐标,其他变量标记目标窗口中的一个矩形。
- window.putwin(file)
- 将与窗口关联的所有数据写入提供的文件对象。 稍后可以使用 getwin() 函数检索此信息。
- window.redrawln(beg, num)
- 指示从 beg 行开始的 num 屏幕行已损坏,应在下一次 refresh() 调用时完全重绘。
- window.redrawwin()
- 触摸整个窗口,使其在下一次 refresh() 调用时完全重绘。
- window.refresh([pminrow, pmincol, sminrow, smincol, smaxrow, smaxcol])
立即更新显示(将实际屏幕与以前的绘图/删除方法同步)。
6 个可选参数只能在窗口是使用 newpad() 创建的垫时指定。 需要附加参数来指示涉及垫和屏幕的哪个部分。 pminrow 和 pmincol 指定要在焊盘中显示的矩形的左上角。 sminrow、smincol、smaxrow和smaxcol指定要在屏幕上显示的矩形的边缘。 要在面板中显示的矩形的右下角是根据屏幕坐标计算的,因为矩形必须具有相同的大小。 两个矩形都必须完全包含在它们各自的结构中。 pminrow、pmincol、sminrow或smincol的负值被视为零。
- window.resize(nlines, ncols)
- 为 Curses 窗口重新分配存储空间以将其尺寸调整为指定值。 如果任一维度大于当前值,则窗口的数据将填充为将当前背景再现(由 bkgdset() 设置)合并到其中的空白。
- window.scroll([lines=1])
- 将屏幕或滚动区域向上滚动 行 行。
- window.scrollok(flag)
- 控制当窗口的光标移出窗口边缘或滚动区域时发生的情况,无论是作为底行换行操作的结果,还是键入最后一行的最后一个字符。 如果 flag 为假,则光标留在底行。 如果 flag 为真,则窗口向上滚动一行。 注意,为了在终端上获得物理滚动效果,还需要调用idlok()。
- window.setscrreg(top, bottom)
- 设置从top行到bottom行的滚动区域。 所有滚动操作都将在该区域中进行。
- window.standend()
- 关闭突出属性。 在某些终端上,这具有关闭所有属性的副作用。
- window.standout()
- 打开属性 A_STANDOUT。
- window.subpad(begin_y, begin_x)
window.subpad(nlines, ncols, begin_y, begin_x)
- 返回一个子窗口,其左上角在
(begin_y, begin_x)
,宽/高为 ncols/nlines。
- window.subwin(begin_y, begin_x)
window.subwin(nlines, ncols, begin_y, begin_x) 返回一个子窗口,其左上角在
(begin_y, begin_x)
,宽/高为 ncols/nlines。默认情况下,子窗口会从指定位置延伸到窗口的右下角。
- window.syncdown()
- 触摸在其任何祖先窗口中触摸过的窗口中的每个位置。 该例程由 refresh() 调用,因此几乎不需要手动调用它。
- window.syncok(flag)
- 如果在 flag 设置为
True
的情况下调用,则每当窗口发生变化时都会自动调用 syncup()。
- window.syncup()
- 触摸窗口祖先中已在窗口中更改的所有位置。
- window.timeout(delay)
- 为窗口设置阻塞或非阻塞读取行为。 如果 delay 为负,则使用阻塞读取(将无限期等待输入)。 如果 delay 为零,则使用非阻塞读取,如果没有输入等待,则 getch() 将返回 -1。 如果 delay 为正,则 getch() 将阻塞 delay 毫秒,如果在该时间结束时仍然没有输入,则返回 -1。
- window.touchline(start, count[, changed])
- 假设 count 行已更改,从 start 行开始。 如果提供 changed,它指定受影响的行是标记为已更改(changed=1)或未更改(changed=0)。
- window.touchwin()
- 假装整个窗口已更改,以进行绘图优化。
- window.untouchwin()
- 将窗口中的所有行标记为自上次调用 refresh() 以来未更改。
- window.vline(ch, n)
window.vline(y, x, ch, n)
- 显示一条从
(y, x)
开始、长度为 n 的垂直线,由字符 ch 组成。
15.11.3. 常数
curses 模块定义了以下数据成员:
- curses.ERR
- 一些返回整数的curses 例程,例如
getch()
,在失败时返回ERR。
- curses.version
- 表示模块当前版本的字符串。 也可用作
__version__
。
一些常量可用于指定字符单元格属性。 可用的确切常数取决于系统。
属性 | 意义 |
---|---|
A_ALTCHARSET
|
替代字符集模式 |
A_BLINK
|
闪烁模式 |
A_BOLD
|
粗体模式 |
A_DIM
|
调光模式 |
A_INVIS
|
不可见或空白模式 |
A_NORMAL
|
普通属性 |
A_PROTECT
|
保护模式 |
A_REVERSE
|
反转背景色和前景色 |
A_STANDOUT
|
突出模式 |
A_UNDERLINE
|
下划线模式 |
A_HORIZONTAL
|
水平高亮 |
A_LEFT
|
左侧高亮 |
A_LOW
|
低亮点 |
A_RIGHT
|
右侧高亮 |
A_TOP
|
顶级亮点 |
A_VERTICAL
|
垂直高光 |
A_CHARTEXT
|
提取字符的位掩码 |
几个常量可用于提取某些方法返回的相应属性。
位掩码 | 意义 |
---|---|
A_ATTRIBUTES
|
用于提取属性的位掩码 |
A_CHARTEXT
|
提取字符的位掩码 |
A_COLOR
|
用于提取颜色对字段信息的位掩码 |
键由名称以 KEY_
开头的整数常量引用。 可用的确切键帽取决于系统。
关键常数 | 钥匙 |
---|---|
KEY_MIN
|
最小键值 |
KEY_BREAK
|
断键(不可靠) |
KEY_DOWN
|
向下箭头 |
KEY_UP
|
向上箭头 |
KEY_LEFT
|
左箭头 |
KEY_RIGHT
|
右箭头 |
KEY_HOME
|
Home键(向上+向左箭头) |
KEY_BACKSPACE
|
退格(不可靠) |
KEY_F0
|
功能键。 最多支持 64 个功能键。 |
KEY_Fn
|
功能键值 n |
KEY_DL
|
删除行 |
KEY_IL
|
插入行 |
KEY_DC
|
删除字符 |
KEY_IC
|
插入字符或进入插入模式 |
KEY_EIC
|
退出插入字符模式 |
KEY_CLEAR
|
清屏 |
KEY_EOS
|
清除到屏幕结束 |
KEY_EOL
|
清除到行尾 |
KEY_SF
|
向前滚动 1 行 |
KEY_SR
|
向后滚动 1 行(反向) |
KEY_NPAGE
|
下一页 |
KEY_PPAGE
|
上一页 |
KEY_STAB
|
设置选项卡 |
KEY_CTAB
|
清除标签 |
KEY_CATAB
|
清除所有标签 |
KEY_ENTER
|
输入或发送(不可靠) |
KEY_SRESET
|
软(部分)复位(不可靠) |
KEY_RESET
|
重置或硬重置(不可靠) |
KEY_PRINT
|
打印 |
KEY_LL
|
首页向下或底部(左下) |
KEY_A1
|
键盘左上角 |
KEY_A3
|
键盘右上角 |
KEY_B2
|
键盘中心 |
KEY_C1
|
键盘左下角 |
KEY_C3
|
键盘右下角 |
KEY_BTAB
|
返回标签 |
KEY_BEG
|
乞求(开始) |
KEY_CANCEL
|
取消 |
KEY_CLOSE
|
关闭 |
KEY_COMMAND
|
Cmd(命令) |
KEY_COPY
|
复制 |
KEY_CREATE
|
创建 |
KEY_END
|
结束 |
KEY_EXIT
|
退出 |
KEY_FIND
|
查找 |
KEY_HELP
|
帮助 |
KEY_MARK
|
马克 |
KEY_MESSAGE
|
留言 |
KEY_MOVE
|
移动 |
KEY_NEXT
|
下一个 |
KEY_OPEN
|
打开 |
KEY_OPTIONS
|
选项 |
KEY_PREVIOUS
|
上一页(上一页) |
KEY_REDO
|
重做 |
KEY_REFERENCE
|
Ref(参考) |
KEY_REFRESH
|
刷新 |
KEY_REPLACE
|
替换 |
KEY_RESTART
|
重启 |
KEY_RESUME
|
简历 |
KEY_SAVE
|
保存 |
KEY_SBEG
|
移位乞求(开始) |
KEY_SCANCEL
|
转移取消 |
KEY_SCOMMAND
|
转移命令 |
KEY_SCOPY
|
移位副本 |
KEY_SCREATE
|
转移创造 |
KEY_SDC
|
移位删除字符 |
KEY_SDL
|
移位删除行 |
KEY_SELECT
|
选择 |
KEY_SEND
|
移位结束 |
KEY_SEOL
|
移位清除线 |
KEY_SEXIT
|
移位退出 |
KEY_SFIND
|
移位查找 |
KEY_SHELP
|
转移帮助 |
KEY_SHOME
|
搬家 |
KEY_SIC
|
移位输入 |
KEY_SLEFT
|
左移箭头 |
KEY_SMESSAGE
|
转移消息 |
KEY_SMOVE
|
移位移动 |
KEY_SNEXT
|
下一个 |
KEY_SOPTIONS
|
转移选项 |
KEY_SPREVIOUS
|
上一页 |
KEY_SPRINT
|
移印 |
KEY_SREDO
|
移位重做 |
KEY_SREPLACE
|
移位替换 |
KEY_SRIGHT
|
右移箭头 |
KEY_SRSUME
|
转移简历 |
KEY_SSAVE
|
转移保存 |
KEY_SSUSPEND
|
转移暂停 |
KEY_SUNDO
|
移位撤销 |
KEY_SUSPEND
|
暂停 |
KEY_UNDO
|
撤消 |
KEY_MOUSE
|
鼠标事件发生 |
KEY_RESIZE
|
终端调整大小事件 |
KEY_MAX
|
最大键值 |
在 VT100 及其软件仿真器上,例如 X 终端仿真器,通常至少有四个功能键(KEY_F1
、KEY_F2
、KEY_F3
、KEY_F4
)可用,并且箭头键以明显的方式映射到 KEY_UP
、KEY_DOWN
、KEY_LEFT
和 KEY_RIGHT
。 如果您的机器有 PC 键盘,那么使用箭头键和十二个功能键是安全的(旧的 PC 键盘可能只有十个功能键); 此外,以下键盘映射是标准的:
键帽 | 常数 |
---|---|
Insert | KEY_IC |
Delete | KEY_DC |
Home | KEY_HOME |
End | KEY_END |
Page Up | KEY_PPAGE |
Page Down | KEY_NPAGE |
下表列出了备用字符集中的字符。 这些是从 VT100 终端继承的,通常可在 X 终端等软件仿真中使用。 当没有可用的图形时,curses 会使用粗略的可打印 ASCII 近似值。
ACS代码 | 意义 |
---|---|
ACS_BBSS
|
右上角的备用名称 |
ACS_BLOCK
|
实心方块 |
ACS_BOARD
|
方格 |
ACS_BSBS
|
水平线的替代名称 |
ACS_BSSB
|
左上角的备用名称 |
ACS_BSSS
|
顶部 T 恤的替代名称 |
ACS_BTEE
|
底部三通 |
ACS_BULLET
|
子弹 |
ACS_CKBOARD
|
棋盘(点画) |
ACS_DARROW
|
向下的箭头 |
ACS_DEGREE
|
度数符号 |
ACS_DIAMOND
|
钻石 |
ACS_GEQUAL
|
大于或等于 |
ACS_HLINE
|
水平线 |
ACS_LANTERN
|
灯笼符号 |
ACS_LARROW
|
左箭头 |
ACS_LEQUAL
|
小于或等于 |
ACS_LLCORNER
|
左下角 |
ACS_LRCORNER
|
右下角 |
ACS_LTEE
|
左三通 |
ACS_NEQUAL
|
不等号 |
ACS_PI
|
字母 pi |
ACS_PLMINUS
|
加号或减号 |
ACS_PLUS
|
大加号 |
ACS_RARROW
|
向右箭头 |
ACS_RTEE
|
右三通 |
ACS_S1
|
扫描线 1 |
ACS_S3
|
扫描线 3 |
ACS_S7
|
扫描线 7 |
ACS_S9
|
扫描线 9 |
ACS_SBBS
|
右下角的备用名称 |
ACS_SBSB
|
垂直线的替代名称 |
ACS_SBSS
|
右 T 恤的替代名称 |
ACS_SSBB
|
左下角的备用名称 |
ACS_SSBS
|
底部 T 恤的替代名称 |
ACS_SSSB
|
左三通的替代名称 |
ACS_SSSS
|
交叉或大加的替代名称 |
ACS_STERLING
|
英镑 |
ACS_TTEE
|
上衣 |
ACS_UARROW
|
向上箭头 |
ACS_ULCORNER
|
左上角 |
ACS_URCORNER
|
右上角 |
ACS_VLINE
|
垂直线 |
下表列出了预定义的颜色:
常数 | 颜色 |
---|---|
COLOR_BLACK
|
黑色 |
COLOR_BLUE
|
蓝色 |
COLOR_CYAN
|
青色(浅绿蓝) |
COLOR_GREEN
|
绿色 |
COLOR_MAGENTA
|
洋红色(紫红色) |
COLOR_RED
|
红色 |
COLOR_WHITE
|
白色 |
COLOR_YELLOW
|
黄色 |
15.12. 诅咒.textpad - 用于诅咒程序的文本输入小部件
1.6 版中的新功能。
curses.textpad 模块提供了一个 Textbox 类,用于在 Curses 窗口中处理基本文本编辑,支持一组类似于 Emacs 的键绑定(因此,也是 Netscape Navigator、BBedit 6 .x、FrameMaker 和许多其他程序)。 该模块还提供了一个矩形绘制功能,可用于文本框或其他目的。
模块 curses.textpad 定义了以下函数:
- curses.textpad.rectangle(win, uly, ulx, lry, lrx)
- 画一个长方形。 第一个参数必须是一个窗口对象; 其余参数是相对于该窗口的坐标。 第二个和第三个参数是要绘制的矩形左上角的 y 和 x 坐标; 第四个和第五个参数是右下角的 y 和 x 坐标。 矩形将使用 VT100/IBM PC 形式的字符在终端(包括 xterm 和大多数其他软件终端仿真器)上绘制。 否则,它将使用 ASCII 破折号、竖线和加号绘制。
15.12.1. 文本框对象
您可以按如下方式实例化 Textbox 对象:
- class curses.textpad.Textbox(win)
返回一个文本框小部件对象。 win 参数应该是一个curses
WindowObject
,其中包含文本框。 文本框的编辑光标最初位于包含窗口的左上角,坐标为(0, 0)
。 实例的 stripspaces 标志最初是打开的。Textbox 对象有以下方法:
- edit([validator])
这是您通常会使用的入口点。 它接受编辑击键,直到输入终止击键之一。 如果提供了 validator,它必须是一个函数。 每次以击键为参数输入的击键都会调用它; 命令调度是在结果上完成的。 此方法以字符串形式返回窗口内容; 是否包含窗口中的空白受 stripspaces 属性的影响。
- do_command(ch)
处理单个命令击键。 以下是支持的特殊击键:
击键
行动
Control-A
转到窗口的左边缘。
Control-B
光标向左,如果合适,换行到上一行。
Control-D
删除光标下的字符。
Control-E
转到右边缘(关闭条带空间)或行尾(开启条带空间)。
Control-F
光标向右,适当时换行到下一行。
Control-G
终止,返回窗口内容。
Control-H
向后删除字符。
Control-J
如果窗口为 1 行则终止,否则插入换行符。
Control-K
如果行为空,删除它,否则清除到行尾。
Control-L
刷新屏幕。
Control-N
光标向下; 向下移动一行。
Control-O
在光标位置插入一个空行。
Control-P
光标向上; 向上移动一行。
如果光标位于无法移动的边缘,则移动操作不起作用。 在可能的情况下支持以下同义词:
常数
击键
KEY_LEFT
Control-B
KEY_RIGHT
Control-F
KEY_UP
Control-P
KEY_DOWN
Control-N
KEY_BACKSPACE
Control-h
所有其他击键都被视为插入给定字符并向右移动(带换行)的命令。
- gather()
以字符串形式返回窗口内容; 是否包含窗口中的空白受 stripspaces 成员的影响。
- stripspaces
此属性是一个标志,用于控制窗口中空白的解释。 当它打开时,每行的尾随空白将被忽略; 将光标放在尾随空白上的任何光标移动都会转到该行的末尾,并且在收集窗口内容时会去除尾随空白。