在 python curses 中对 getch() 使用退格键

Using backspace with getch() in python curses

我希望用户能够输入每个字符,就像 getch() 的工作方式一样。我还打开了 echo(),因为我想打印出用户键入的每个字符。但是,我也希望用户能够按下退格键,并让他在按下退格键之前按下的键从屏幕上删除,就像退格键在文本编辑器中的工作方式一样。我怎样才能做到这一点?我正在使用 python 3.6 和 curses 库(很明显)。如果您想到目前为止看到我的代码,这里是:

import curses

# ----- INIT -----
stdscr = curses.initscr()
curses.cbreak()
stdscr.keypad(1)

# ----- PRINT -----
text = "Hello world"
stdscr.addstr(1, 0, text + "\n")
stdscr.refresh()

# ----- MAIN LOOP ------
while 1:
    c = stdscr.getch()
    if c == ord('q'):
        break

# ----- RESET TERMINAL -----
curses.echo()
curses.nocbreak()
stdscr.keypad(1)
curses.endwin()

您可以这样做:禁用回显,使用显式库调用来回显 "backspace" 通常选择以外的字符:

import curses

# ----- INIT -----
stdscr = curses.initscr()
curses.cbreak()
curses.noecho()
stdscr.keypad(1)

# ----- PRINT -----
text = "Hello world"
stdscr.addstr(1, 0, text + "\n")
stdscr.refresh()

# ----- MAIN LOOP ------
while 1:
    c = stdscr.getch()
    if c == ord('q'):
        break
    if c == 8 or c == 127 or c == curses.KEY_BACKSPACE:
        stdscr.addstr("\b \b")
    else:
        stdscr.addch(c)

# ----- RESET TERMINAL -----
curses.echo()
curses.nocbreak()
stdscr.keypad(1)
curses.endwin()

Python curses 参考没有详细介绍 addch, but since it is a wrapper around curses, you can read its manual page 文字返回的方式space \b 被解释为使光标向后移动。该示例然后写入一个 space(擦除那里的任何内容),然后将光标移回空的 space.