【问题标题】:Python 3: Strange behavior of msvcrt.getch(), the command used to read individual keypressesPython 3:msvcrt.getch() 的奇怪行为,用于读取单个按键的命令
【发布时间】:2017-09-09 06:06:49
【问题描述】:

问题的简单版本:

这里我想按顺序打印三个数字,但用户必须按 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();

相反,它会打印我在提示文本之前输入的内容,甚至不会在我输入每个字符时打印它们。这是我输入“EXAMPLE”后的输出:

EXAMPLMake a question:

在我按下 ENTER 后:

EXAMPLMake a question:
EXAMPLEend

我继续弄乱代码试图找到某种逻辑,但最重要的是,msvcrt.getch() 仅在单个按键位于新创建的行时才能正确注册它们。我该怎么做才能使程序完全符合我的要求?

【问题讨论】:

    标签: python 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");
    

    另请参阅 SO 上的“How to flush output of Python print?”。

    【讨论】:

    • 谢谢!!正如答案之一,在打印函数末尾添加参数“flush = True”也可以。
    猜你喜欢
    • 2014-04-17
    • 2015-03-28
    • 1970-01-01
    • 2020-08-27
    • 1970-01-01
    • 2012-04-05
    • 2022-12-06
    • 1970-01-01
    • 2012-06-21
    相关资源
    最近更新 更多