如何在Python中检测ESCape按键?

如何在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

我正在命令窗口(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 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值,我更喜欢第二个例子。谢谢