Как я могу изменить положение курсора пользовательского ввода в функции input () в Python? - PullRequest
2 голосов
/ 07 мая 2020

При использовании функции input() я хочу принять или получить строку от пользователя к переменной. Так можно ли вводить в квадратных скобках вместо обычного текста? Например;

a = input("-->")

это показывает вывод, подобный этому:

-->

, но вместо этого я могу получить такой вывод:

--> [ _ ]

и взять ввод внутри квадратной скобки. (_ представляет курсор.)

Ответы [ 3 ]

3 голосов
/ 07 мая 2020

Управление положением курсора при вызове input() требует взлома с escape-последовательностями ANSI. (См. Ответ @chepner.) Чтобы делать то, что вы хотите более правильно, вам нужно использовать библиотеку, которая может управлять терминалом, например curses .

2 голосов
/ 07 мая 2020

Можно, вроде как. Если ваш терминал поддерживает escape-последовательности ANSI, вы можете сохранить текущую позицию курсора, вывести \033[s и переместить курсор обратно в последнюю сохраненную позицию с помощью \033[u. Тогда ваш вызов input будет выглядеть как

a = input("--> [\033[s ]\033[u")

Однако это чисто визуально: ничто не мешает вам набрать «за пределами» квадратной скобки. Основное ограничение состоит в том, что input ничего не знает о терминале; он просто читает из стандартного ввода, который буферизуется по строке. input ничего не возвращает, пока не будет введена вся строка; до тех пор он просто ждет, пока терминал отправит что-то . Библиотека вроде curses обеспечивает гораздо более точную обработку; например, он может перестать реагировать на нажатия клавиш, если вы попытаетесь ввести в командной строке за пределами ].

0 голосов
/ 08 мая 2020

Следующий фрагмент кода, использующий curses, будет обрабатывать стандартные видимые символы ascii, удаляющие символы и новую строку (для отправки).

from curses import wrapper

def prompt(stdscr, prompt_template="--> [ {} ]"):
    user_inp = ""
    display_str = prompt_template.format(user_inp)

    stdscr.addstr(0, 0, display_str)
    while True:
        inp_ch = stdscr.getch()

        # standard ASCII characters
        if 32 <= inp_ch <= 126:
            user_inp += chr(inp_ch)
        elif inp_ch in (8, 127, 263): # BS, DEL, Key_Backspace
            user_inp = user_inp[:-1]
        elif inp_ch == 10: # is newline, enter pressed
            break
        else: # all other characters are ignored
            continue

        display_str = prompt_template.format(user_inp)
        stdscr.erase()
        stdscr.addstr(0, 0, display_str)
        stdscr.refresh()

    return user_inp

print(wrapper(prompt))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...