如何在Python中检测ESCape按键?

rsaldnfx  于 2023-06-04  发布在  Python
关注(0)|答案(5)|浏览(157)

我在命令窗口(Windows 7,Python 3.1)中运行一个进程,希望用户按Esc键中止该进程。但是,按Esc键似乎不会执行任何操作,循环永远不会中断。我也试过从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!

如果有人能告诉我我可能会错在哪里,我将不胜感激。

1mrurvl1

1mrurvl11#

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
6uxekuva

6uxekuva2#

你真的应该多剥一些,就像下面这个:

>>> 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
解决方案对你来说应该是显而易见的。
更多关于字符串与字节的信息,请参阅Dive into Python 3。
交互式控制台对调试非常有用,尝试多用它:)

hfyxw5xn

hfyxw5xn3#

你不需要encode,decode,chr,ord,....

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

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

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

oymdgrw74#

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模块,其中包含更多内容。

mfuanj7w

mfuanj7w5#

你有没有试过用另一个键来测试它是否不只是那个键?
你是否也尝试了here的例子,看看它们是否有效?

相关问题