Переместить курсор назад для ввода Ввод Python - PullRequest
1 голос
/ 18 апреля 2020

Я пытался сделать так:

a = input('Enter your name:_____________________________________________')

, но здесь курсор расположен на:

Enter your name:_____________________________________________
                                                             ^
                                                            Here

Как мне установить курсор на:

Enter your name:_____________________________________________
                ^
               Here

Я делаю это на IDLE. (Командная строка также приветствуется :))

Ответы [ 3 ]

1 голос
/ 18 апреля 2020

Вы можете использовать символ \r, чтобы вернуться к началу строки и перезаписать текст, пока вы не захотите ввести курсор ввода:

print("Enter your name: ____________________", end='\rEnter your name: ', flush=True)
a = input()

Стоит отметить, что перемещение курсора работает только в некоторых Консоли, например, не будут работать в IDLE, но будут работать в windows командной строке

1 голос
/ 18 апреля 2020

Посмотрев дальше, мое окончательное решение - создать свой собственный ввод. Примечание: это работает только в командной строке 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

1 голос
/ 18 апреля 2020

Составьте свой текстовый запрос, несколько символов подчеркивания, а затем такое же количество символов возврата (\b).

n_underscores = 45
a = input('Enter your name:' + '_' * n_underscores + '\b' * n_underscores)
print('Hi,', a)
...