Python Curses - 检测退格键

时间:2017-11-25 01:53:31

标签: python python-3.x macos-high-sierra python-curses

我在使用Curses模块检测Backspace密钥时遇到了困难。每当我按退格键时,返回的字符/字符串都是' ^?'但是我无法通过以下方式检测到它:

如果str(key)==' ^?':

以下代码设置为运行

import curses

def main(win):
    win.nodelay(True)
    key = ''
    record = ''
    win.clear()
    win.addstr("Key:")
    win.addstr('\n\nRecord:')
    win.addstr(record)
    while True:
        try:
            key = win.getkey()

            if str(key) == '^?':
                # Attempt at detecting the Backspace key
                record = record[:-1]

            elif str(key) == '\n':
                # Attempt at detecting the Enter Key
                record = ''

            else:
                record += str(key)
            win.clear()
            win.addstr("Key:")
            win.addstr(str(key))
            win.addstr('\n\nRecord:')
            win.addstr(record)
            if key == os.linesep:
                break
        except Exception as e:
            # No input
            pass

curses.wrapper(main)
# CTRL+C to close the program

2 个答案:

答案 0 :(得分:1)

在我的机器上,运行Python 3.5.2或2.7.12,当我按退格键并使用

时,我显示为KEY_BACKSPACE
if str(key) == 'KEY_BACKSPACE':

取代

if str(key) == '^?':

导致退格键退避字母record

我认为在您的系统上,您可能会获得实际的退格字符。在这种情况下,您可以尝试'\b'代替'^?',根据the docs,这是ASCII退格符的字符串转义。

答案 1 :(得分:1)

根据您的澄清评论,终端中的退格区既不是'KEY_BACKSPACE'也不是'\b''\x08')。

由于您正在使用调用curses.wrapper()的{​​{1}},这表明您的curses.initscr()数据库(不太可能)或您的终端配置(更有可能)出现问题

terminfogetkey() == 'KEY_BACKSPACE'应该适用于任何配置正确的系统,因此您也可能在其他应用程序中遇到问题。

getch() == curses.KEY_BACKSPACE环境变量是终端类型如何与需要超出基本电传类型的功能的工具进行通信的方式,因此,要解决这个问题,首先要检查环境变量{/ 1}}环境变量中包含的内容你在哪里运行Python。

TERM

作为一种快速黑客攻击,您可以检查其观察到的所有值。

TERM