getch() 返回错误字符

3 投票
1 回答
2018 浏览
提问于 2025-04-17 20:41

我在使用 curses 库里的 getch() 函数时遇到了一些问题。假设我们有以下这个程序:

import curses

def main(stdscr):
    while 1:
        c = stdscr.getch()
        stdscr.addstr(chr(c) + ": " + str(c) + "\n")
curses.wrapper(main)

我们运行这个程序,然后输入以下字符: a<backspace>œ

然后输出结果是:

a: 97
ć: 263
Å: 197

你可以看到,a 这个字符是正确读取的。但是其他的字符就不行了。我只想获取退格键 '\b' 和 unicode 字符 œ,但结果却得到了其他的东西。

为什么 getch() 会这样表现,我该怎么才能得到我想要的结果呢?

补充说明:

我想强调的是,这并不是打印字符的问题,而是读取字符的问题。也就是说,运行 stdscr.addstr('œ') 确实可以打印出 œ

1 个回答

4

在Python 3.3版本中,新增了一个叫做 window.get_wch 的功能。这个功能可以正确处理各种字符。

如果你查看 window.getch 的说明,你会发现它并没有说支持非ASCII的可打印字符。它只是说明可以处理一些特殊的按键,比如功能键或者数字键盘的按键。

补充说明:

使用 window.get_wch 时,输入的字符(比如 'a''ă''好''\n''\t')会以字符串的形式返回。而功能键则会以整数的形式返回(例如 265274)。这里有一个新的示例可以运行。你可以尝试按不同的键,看看它们的返回值是什么。打印出来的数据格式是: [repr]: [type]

def main(stdscr):
    while 1:
        c = stdscr.get_wch()
        stdscr.addstr("%s: %s\n" % (repr(c), type(c)))

当我输入 aœ<enter><backspace><F1> 时,得到的结果是:

'a': <class 'str'>
'œ': <class 'str'>
'\n': <class 'str'>
'\x7f': <class 'str'>
265: <class 'int'>

如果返回的是一个整数,你可以通过 curses.keyname 来查找按下的键的名称:

>>> curses.keyname(265)
b'KEY_F(1)'

撰写回答