Я пытаюсь написать функцию в 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