在python curses中使用getch()和backspace

时间:2018-08-18 17:11:26

标签: python curses

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

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()

1 个答案:

答案 0 :(得分:2)

您可以执行以下操作:禁用回显,使用显式的库调用来回显除“退格”的通常选择以外的字符:

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()

关于addch的Python curses参考文献没有涉及太多细节,但是由于它是curses的包装,因此您可以阅读其manual page来了解文字退格 {{1 }} 被解释为使光标向后移动。然后,该示例写入一个空格(擦除其中的任何内容),然后将光标移回空白空间。