python: Терминальный ввод, выводить все, кроме символа новой строки, и обрабатывать backspace? - PullRequest
0 голосов
/ 01 июня 2018

Я пытаюсь написать функцию в Python-3.x, которая будет предлагать пользователю вводить символы с клавиатуры.Я хочу, чтобы все символы отображались нормально, за исключением последнего символа новой строки, который завершает ввод.

Следующая функция делает это правильно, кроме случаев, когда ввод Backspace.Когда пользователь печатает клавишу Backspace, я хочу, чтобы самый правый символ на экране был удален, а курсор переместился на одну позицию влево, как в обычном режиме ввода с терминала.

Однако я не могу этого получитьработать правильно здесь.Кто-нибудь может предложить способ заставить эту функцию работать должным образом, когда пользователь печатает клавишу возврата?

Спасибо.

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
...