【IT168 技术文档】
获取用户输入
curses 应用程序以击键事件的形式获取所有用户输入。我们已经看过了 .getch() 方法,现在让我们看一下将 .getch() 与其它输入方法组合在一起的例子 .getstr() 。以下就是我们以前提到的 file_func() 函数的缩写版本(它由 "File" 菜单激活)。
清单3:curses_txt2html.py file_func() 函数
def
![]()
file_func():
s = curses.newwin(5,10,2,1)
s.box()
s.addstr(1,2,
"I", hotkey_attr)
s.addstr(1,3,
"nput", menu_attr)
s.addstr(2,2,
"O", hotkey_attr)
s.addstr(2,3,
"utput", menu_attr)
s.addstr(3,2,
"T", hotkey_attr)
s.addstr(3,3,
"ype", menu_attr)
s.addstr(1,2,
"", hotkey_attr)
s.refresh()
c = s.getch()
if
c
in
(ord(
'I'), ord(
'i'), curses.KEY_ENTER, 10):
curses.echo()
s.erase()
screen.addstr(5,33,
" "*43, curses.A_UNDERLINE)
cfg_dict[
'source'] = screen.getstr(5,33)
curses.noecho()
else
:
curses.beep()
s.erase()
return
CONTINUE
绘制了下拉菜单后,程序使用简单的 s.getch() 调用来获取用户的选择项。在演示应用程序中,菜单只响应热键,但不响应箭头键或可移动突出显示栏。可以通过捕捉附加键操作并在下拉菜单中设置事件循环来构建这些更复杂的菜单功能。但这个例子已经足够说明这种概念了。
接着,程序将刚读取的击键与各种热键值做比较。在本例中,热键的大小写都可以激活下拉菜单选项,并且可以使用 ENTER 键激活缺省选项。(curses 特殊键常量看上去并不完全可靠,我发现必须添加实际的 ASCII 值 "10" 来捕捉 ENTER 键。)请注意,如果要执行字符值比较,那么要将字符串封装到 ord() 内置 Python 函数中。
当选中 "Input" 选项时,程序会使用 .getstr() 方法,该方法提供带有原始编辑能力的字段输入(可以使用退格键)。由 ENTER 键终止输入,然后方法返回输入的值。通常会像上例中一样,将这个值分配给一个变量。
为了在视觉上区别输入字段,我使用了一点小技巧,预先向将要发生数据输入的区域添加了下划线。无论如何,这都是必要的,但它添加了一种视觉效果。由以下这行代码画出下划线:
screen.addstr(5,33, " "*43, curses.A_UNDERLINE)
当然,程序还必须除去下划线,这项工作在 draw_dict() 刷新函数中由以下这行代码执行:
结束语screen.addstr(5,33, " "*43, curses.A_NORMAL)
这里概述的技术以及在完整应用程序源代码(请参阅 参考资料 )中使用的那些技术应该可以让您初步了解 curses 编程。请使用它来编写您的应用程序。它并不难使用。告诉您一个好消息,除了 Python 以外,有许多语言可以访问 curses 库,因此您学到的使用 Python curses 模块的知识同样适用于其它语言。
如果经检验,基本 curses 模块不能满足您的要求,“参考资料”节中提供了许多模块的链接,他们增添了 curses 的功能并提供了非常好的发展方向。
关于作者
David Mertz 相信上帝给了我们键盘和 TTY,而其它所有界面设备都是完全是人类的杰作。可以通过 mertz@gnosis.cx 与 David 取得联系。 http://gnosis.cx/publish/ 上刊登了他写的文章。非常欢迎对过去的、这一篇或将来的专栏文章提出意见和建议。
