如何在Python中检测ESCape按键?
我正在命令窗口(Windows7,Python3.1)中运行一个进程,希望用户通过按ESCape键中止该进程。但是,按ESCape键似乎没有任何作用:-(,循环从未中断。我也尝试过从IDE(Wing)中运行脚本,但循环无法中断 以下是我的概念验证测试的精简版本如何在Python中检测ESCape按键?,python,windows,escaping,keypress,Python,Windows,Escaping,Keypress,我正在命令窗口(Windows7,Python3.1)中运行一个进程,希望用户通过按ESCape键中止该进程。但是,按ESCape键似乎没有任何作用:-(,循环从未中断。我也尝试过从IDE(Wing)中运行脚本,但循环无法中断 以下是我的概念验证测试的精简版本 import msvcrt import time aborted = False for time_remaining in range(10,0,-1): # First of all, check if ESCape w
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!
如果有人能告诉我哪里可能出错,我将不胜感激。您是否尝试过使用不同的键来测试它是否不仅仅是该键
您是否也尝试了()中的示例以查看它们是否有效?您是否尝试使用不同的键来测试它是否不仅仅是该键
您是否也尝试了()中的示例以查看它们是否有效?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
或本测试:
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
或本测试:
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
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
或本测试:
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
或本测试:
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()
返回,chr(27)
返回string
。在Python3中,它们是两种不同的类型,因此“=
”部分永远不会工作,if
语句将始终被计算为False
解决办法对你来说应该是显而易见的
关于字符串与字节,摘自《深入Python 3》一书
交互式控制台对于调试非常有用,请尝试更多地使用它:)您真的应该剥离更多,如下所示:
>>> import msvcrt
>>> ch = msvcrt.getch()
# Press esc
>>> ch
b'\x1b'
>>> chr(27)
'\x1b'
>>> ch == chr(27)
False
问题就在这里:msvcrt.getch()
返回,chr(27)
返回string
。在Python3中,它们是两种不同的类型,因此“=
”部分永远不会工作,而if
语句将始终被计算为False
解决办法对你来说应该是显而易见的
关于字符串与字节,摘自《深入Python 3》一书
交互式控制台对于调试非常有用,请尝试更多地使用它:)您不需要编码、解码、chr、ord等
if msvcrt.kbhit() and msvcrt.getch() == b'\x1b':
或者,如果您想在代码中的某个地方看到“27”:
if msvcrt.kbhit() and msvcrt.getch()[0] == 27:
您不需要编码、解码、chr、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)
代码部分取自模块,其中包含更多内容。与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)
代码部分取自模块,其中包含更多内容。谢谢-所有3个解决方案都有效,所以现在我需要决定哪一个最适合我的编程风格;-)致意。谢谢-所有3个解决方案都有效,所以现在我需要决定哪一个最适合我的编程风格;-)您好,Corey,尝试了建议的示例并开始获得“b'\x1b'”输出,多亏了这里的其他海报,我现在知道是bytestring版本,它必须转换为unicode。您好,Corey,尝试了建议的示例并开始获得“b'\x1b'”输出,多亏了这里的其他海报,我现在知道是bytestring版本,它必须转换为unicode。关于ASCII值,我更喜欢第二个例子。谢谢。谈到ASCII值,我更喜欢第二个例子。谢谢