如何在Python中检测ESCape按键?

我正在一个命令窗口(Windows 7,Python 3.1)中运行一个进程,我希望用户通过按下ESCape键来中止进程。 然而,按ESCAP键并没有做任何事情:-(,循环永远不会中断,我也尝试从我的IDE(Wing)运行脚本,但再次,循环不能被打断。

以下是我的概念certificatetesting的精简版本。

import msvcrt import time aborted = False for time_remaining in range(10,0,-1): # First of all, check if ESCape was pressed if msvcrt.kbhit() and msvcrt.getch()==chr(27): aborted = True break print(str(time_remaining)) # so I can see loop is working time.sleep(1) # delay for 1 second #endfor timing loop if aborted: print("Program was aborted") else: print("Program was not aborted") time.sleep(5) # to see result in command window before it disappears! 

如果有人能告诉我哪里可能会出错,我将非常感激。

Solutions Collecting From Web of "如何在Python中检测ESCape按键?"

Python 3字符串是unicode,因此必须编码为字节进行比较。 试试这个测试:

 if msvcrt.kbhit() and msvcrt.getch() == chr(27).encode(): aborted = True break 

或者这个测试:

 if msvcrt.kbhit() and msvcrt.getch().decode() == chr(27): aborted = True break 

或者这个测试:

 if msvcrt.kbhit() and ord(msvcrt.getch()) == 27: aborted = True break 

你真的应该剥下更多,如下所示:

 >>> import msvcrt >>> ch = msvcrt.getch() # Press esc >>> ch b'\x1b' >>> chr(27) '\x1b' >>> ch == chr(27) False 

所以这里是问题: msvcrt.getch()返回byteschr(27)返回string 。 在Python 3中,它们是两种截然不同的类型,所以“ == ”部分将永远不会工作,并且if语句将始终被评估为False

解决方案应该是显而易见的。

有关字符串与字节的更多信息,请参阅“潜入Python 3”一书。

交互式控制台是非常有用的调试,尝试使用它更多:)

你不需要编码,解码,字符,ord,….

 if msvcrt.kbhit() and msvcrt.getch() == b'\x1b': 

或者如果你想在代码中看到“27”:

 if msvcrt.kbhit() and msvcrt.getch()[0] == 27: 

Python 2/3兼容代码:

 import time, sys ESC = '\x1b' PY3K = sys.version_info >= (3,) if PY3K: from msvcrt import kbhit, getwch as _getch else: from msvcrt import kbhit, getch as _getch while not kbhit() or _getch() != ESC: print(time.asctime()) time.sleep(1) 

代码部分是从pager模块采取更多的东西里面。

你是否尝试过使用不同的密钥来测试它是否不仅仅是这个密钥?

你是否也尝试在( http://effbot.org/librarybook/msvcrt.htm )的例子,看看他们的工作?