Python 3:msvcrt.getch() 的奇怪行为,用于读取单个按键的命令
Python 3: Strange behavior of msvcrt.getch(), the command used to read individual keypresses
简单版问题:
这里我想按顺序打印三个数字,但用户必须按 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() 仅在新创建的行上正确注册单个按键。我该怎么做才能使程序完全符合我的要求?
在下面的代码中:
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?”。
简单版问题:
这里我想按顺序打印三个数字,但用户必须按 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() 仅在新创建的行上正确注册单个按键。我该怎么做才能使程序完全符合我的要求?
在下面的代码中:
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?”。