python:终端输入,回显除换行之外的所有内容,并处理退格?

时间:2018-06-01 05:03:05

标签: python-3.x terminal ioctl termios fcntl

我试图在Python-3.x中编写一个函数,它会提示用户从键盘输入字符。我希望所有字符都能正常回显,但最终换行符会终止输入。

除非输入退格,否则以下功能可以正确执行此操作。当用户键入退格键时,我希望屏幕上最右边的字符被删除,光标向左移动一个位置,就像在正常的终端输入模式下一样。

但是,我无法在此处正常工作。任何人都可以建议一种方法,以便在用户输入退格键时使此功能正常工作吗?

谢谢。

def read_until_newline(prompt=None):
    fd = sys.stdin.fileno()
    oldterm = termios.tcgetattr(fd)
    newattr = termios.tcgetattr(fd)
    newattr[3] = newattr[3] & ~termios.ICANON & ~termios.ECHO
    termios.tcsetattr(fd, termios.TCSANOW, newattr)

    oldflags = fcntl.fcntl(fd, fcntl.F_GETFL)
    fcntl.fcntl(fd, fcntl.F_SETFL, oldflags | os.O_NONBLOCK)

    if prompt:
        sys.stdout.write(prompt)
        sys.stdout.flush()

    result = None
    try:
        while True:
            try:
                c = sys.stdin.read(1)
                if c == '\n':
                    break
                elif c == '^?' or c == '^H':
                    if result:
                        ###                                                                                                     
                        ### How do I cause the rightmost                                                                        
                        ### character to be erased on the                                                                       
                        ### screen and the cursor to move                                                                           
                        ### one space to the left?                                                                                          
                        ###                                                                                                     
                        result = result[0:-1]
                    continue
                sys.stdout.write(c)
                sys.stdout.flush()
                if result:
                    result += c
                else:
                    result = c
            except IOError:
                pass
    finally:
        termios.tcsetattr(fd, termios.TCSAFLUSH, oldterm)
        fcntl.fcntl(fd, fcntl.F_SETFL, oldflags)

    return result

0 个答案:

没有答案