Python: win32console добавляет случайные символы для запроса строки по умолчанию - PullRequest
0 голосов
/ 30 декабря 2018

Я использую следующий код (отсюда Как поместить текст в строку ввода: как запросить ввод данных пользователем в командной строке, предоставив ответ «по умолчанию», который пользователь может редактировать или удалять? ), чтобы предложить пользователю изменить строку по умолчанию (в Windows):

import win32console

_stdin = win32console.GetStdHandle(win32console.STD_INPUT_HANDLE)

def input_def(prompt, default=''):
    keys = []
    for c in str(default):
        evt = win32console.PyINPUT_RECORDType(win32console.KEY_EVENT)
        evt.Char = c
        evt.RepeatCount = 1
        evt.KeyDown = True
        keys.append(evt)

    _stdin.WriteConsoleInput(keys)
    return input(prompt)

if __name__ == '__main__':
    name = input_def('Folder name: ', 'it works!!!')
    print()
    print(name)

Моя проблема в том, что иногда один или несколько символов добавляются в мою строку по умолчанию, большую часть времени в начале.То есть приведенный выше код будет отображать, например, Folder name: Ait works!!! в консоли.

Моя переменная keys имеет правильную длину, поэтому я думаю, что с _stdin что-то не так.Это когда _stdin инициализируется _stdin = win32console.GetStdHandle(win32console.STD_INPUT_HANDLE)?Как я могу избавиться от этих случайных символов?

1 Ответ

0 голосов
/ 31 декабря 2018

Звоните _stdin.FlushConsoleInputBuffer() до _stdin.WriteConsoleInput(keys).Вы можете сделать эту опцию по умолчанию истинной, чтобы очистить буфер ввода.Замените его на false, если вам нужно сохранить существующее содержимое.

В идеале ваш сценарий должен поддерживать запасной вариант, если stdin - это дисковый файл или канал (например, терминал MSYS) вместо консоли, или по крайней мере изящный сбойв этом случае.

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