Посмотрев дальше, мое окончательное решение - создать свой собственный ввод. Примечание: это работает только в командной строке windows. Если вы хотите сделать это в Unix, вам придется искать альтернативу. Я могу обновить этот ответ позже для поддержки Unix. [Редактировать: Обновлено для поддержки Unix и Windows]
Опять же, это не будет работать в IDLE
Эта функция принимает префикс для вашего ввода, число max_length для ввода и blank_char для заполнения длины ввода.
Сначала мы фиксируем ввод пользователя и, если это отображаемый символ, мы добавляем его к нашему слову. Каждый раз, когда мы получаем новый символ, мы перезаписываем существующую строку ввода, чтобы соответствовать текущему состоянию слова.
Мы также ищем символ b'\x08'
(возврат), чтобы мы могли удалить последнюю символ из нашего слова и символ возврата, чтобы увидеть, нажал ли наш пользователь Enter.
После нажатия Enter верните слово.
Существует также встроенный предел, где пользователь может ввести только столько символов, сколько есть подчеркивания, так как это приведет к задержке букв, вы всегда можете изменить это, увеличив число подчеркиваний или что-то подобное.
WINDOWS ONLY:
import msvcrt
def windows_get_input(prefix="", underscores=20, blank_char='_'):
word = ""
print(prefix + (underscores - len(word)) * blank_char, end='\r', flush=True)
# Reprint prefix to move cursor
print(prefix, end="", flush=True)
while True:
ch = msvcrt.getch()
if ch in b'\x08':
# Remove character if backspace
word = word[:-1]
elif ch in b'\r':
# break if enter pressed
break
else:
if len(word) == underscores:
continue
try:
char = str(ch.decode("utf-8"))
except:
continue
word += str(char)
# Print `\r` to return to start of line and then print prefix, word and underscores.
print('\r' + prefix + word + (underscores - len(word)) * blank_char, end='\r', flush=True)
# Reprint prefix and word to move cursor
print(prefix + word, end="", flush=True)
print()
return word
print(windows_get_input("Name: ", 20, '_'))
Обработка Windows и Unix
WINDOWS и UNIX:
def unix_getch():
import termios
import sys, tty
def _getch():
fd = sys.stdin.fileno()
old_settings = termios.tcgetattr(fd)
try:
tty.setraw(fd)
ch = sys.stdin.read(1)
finally:
termios.tcsetattr(fd, termios.TCSADRAIN, old_settings)
return ch.encode("utf-8")
return _getch()
def get_input(prefix="", underscores=20, blank_char='_'):
word = ""
try:
import msvcrt
func = msvcrt.getch
except:
func = unix_getch
print(prefix + (underscores - len(word)) * blank_char, end='\r', flush=True)
# Reprint prefix to move cursor
print(prefix, end="", flush=True)
while True:
ch = func()
if ch in b'\x08\x7f':
# Remove character if backspace
word = word[:-1]
elif ch in b'\r':
# break if enter pressed
break
else:
if len(word) == underscores:
continue
try:
char = str(ch.decode("utf-8"))
except:
continue
word += str(char)
# Print `\r` to return to start of line and then print prefix, word and underscores.
print('\r' + prefix + word + (underscores - len(word)) * blank_char, end='\r', flush=True)
# Reprint prefix and word to move cursor
print(prefix + word, end="", flush=True)
print()
return word
print(get_input("Name: ", 20, '_'))
Обработка IDLE
С IDLE это не удается , Спасибо Python за то, что дали нам это ... Во всяком случае, если вы хотите работать с IDLE, просто добавьте в начало функции get_input()
следующее:
import sys
if 'idlelib.run' in sys.modules:
return input(prefix)
Это проверит, если вы используют IDLE и просто запрашивают у пользователя ввод данных в обычном режиме.
Обновление 1: перемещен курсор на следующую позицию символа
Обновление 2: добавлена поддержка Unix
Обновление 2.1: Отдельный оригинал Windows только ответ и Windows и Unix ответ
Обновление 3: Обработка IDLE