Python 3:msvcrt.getch()的奇怪行为,用于读取单个按键的命令

时间:2017-09-09 06:06:49

标签: python getch

问题的简单版本:

这里我想按顺序打印三个数字,但用户必须在2和3之间按一个键:

import msvcrt

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

显然,它打印出来:

1
2

然后等待按键,然后在2以下的新行上打印3.但是,如果我决定不想在2到3之间换行怎么办?考虑到我希望2和3打印在彼此旁边,我会将代码更改为:

import msvcrt

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

但是,不是打印1和2,而是打印

1

并且只有在我按下它之后才打印剩下的两个数字

1
23

msvcrt.getch()的问题是什么,不想在书面线上等待?

问题的正常版本(更接近我的程序):

我正在创建一个程序,用于捕获用户输入的每个字符,并在用户写入问题时打印它们(这很重要,因为它将具有一个技巧,需要在按Enter之前准确知道用户所写的内容):

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 个答案:

答案 0 :(得分:0)

在下面的代码中:

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

按下键后出现“2”,因为在打印“3”后刷新stdout流。

你可以试试这个:

import sys

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

另见SO上的“How to flush output of Python print?”。