Python 3: Странное поведение msvcrt.getch(), команды, используемой для чтения отдельных нажатий клавиш

Простая версия проблемы:

Здесь я хочу напечатать три числа по порядку, но пользователь должен нажать клавишу от 2 до 3:

import msvcrt

print("1");
print("2");
msvcrt.getch();
print("3");

Очевидно, это печатает:

1
2

Затем ждет нажатия клавиши, чтобы затем напечатать 3 на новой строке ниже 2. Но что, если я решу, что не хочу разрыва строки между 2 и 3? Учитывая, что я хочу, чтобы 2 и 3 печатались рядом друг с другом, я бы изменил код на:

import msvcrt

print("1");
print("2", end="");
msvcrt.getch();
print("3");

Но вместо того, чтобы печатать 1 и 2, он просто печатает

1

и только после нажатия клавиши он печатает оставшиеся два числа

1
23

В чем проблема msvcrt.getch() с нежеланием ждать на записанной строке?

Обычная версия проблемы (ближе к тому, как выглядит моя программа):

Я делаю программу, которая фиксирует каждый символ, введенный пользователем, и печатает их по мере того, как пользователь пишет вопрос (это важно, потому что в нем будет хитрость, которая должна точно знать, что пользователь написал перед нажатием клавиши ВВОД):

import msvcrt
import sys
import os

def main():

    question = "";
    ch = "a";

    while ch != '\r':

        absolutely_unused_variable = os.system('cls');
        print("Make a question:");
        print(question, end="");
        ch = msvcrt.getch().decode('utf-8');
        question = question + ch;

    print("end");

if __name__ == '__main__':
    main();

Прямо сейчас я ожидаю, что результат будет выглядеть так, как будто код

import os

os.system('cls');
print("Make a question:");
question = input();

Вместо этого он печатает то, что я печатаю перед текстом подсказки, и даже не печатает каждый символ, когда я их печатаю. Это вывод после того, как я наберу "ПРИМЕР":

EXAMPLMake a question:

И после того, как я нажму ENTER:

EXAMPLMake a question:
EXAMPLEend

Я продолжал возиться с кодом, пытаясь найти какую-то логику, но суть в том, что просто, msvcrt.getch() правильно регистрирует отдельные нажатия клавиш, только если они находятся во вновь созданной строке. Что я могу сделать, чтобы сделать программу именно так, как я хочу тогда?

1 ответ

Решение

В приведенном ниже коде:

print("1");
print("2", end="");
msvcrt.getch();
print("3");

"2" появляется после нажатия клавиши, потому что stdout Поток сбрасывается после печати "3".

Вы можете попробовать это:

import sys

print("1");
print("2", end="");
sys.stdout.flush()
msvcrt.getch();
print("3");

Смотрите также " Как очистить вывод печати Python? На ТАК.

Другие вопросы по тегам