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? На ТАК.