【问题标题】:How to capture special keys for python console application如何为 python 控制台应用程序捕获特殊键
【发布时间】:2014-08-26 18:30:47
【问题描述】:

Python 2.7

我正在尝试使用 msvcrt 模块中的 getch() 函数在我正在编写的应用程序中捕获按键。有些很简单,回车是 13,退格是 8,.> 是 46 等等。有些键,比如 Home,我搞不定。

来自 getch() 的文档字符串:

“如果按下的键是特殊功能键,则返回‘000’或‘xe0’;下一次调用将返回键码。”

我已尝试测试返回值“000”或“xe0”,但未返回。发生的情况是我返回了 224,并且在下一次调用 getch() 时我得到了另一个代码,因此 Home 是 71。其他特殊键的行为也是如此,End 是 224 79,Insert 是 224 82,Page Up 是 224 73等我无法解释这种行为;我试过看看是否将这两个值相加,然后去掉 2 的幂(即 224 + 73 - 256),但它不会产生任何有用的东西。

是否有人理解这种行为和/或是否有人对如何捕获这些密钥有任何建议(我不想硬编码 224 + x 模式值,因为我不确定这些与其他用户是否一致) ?

谢谢。

编辑: 如果有人想尝试,请编写代码

import msvcrt

while True:
    key = msvcrt.getch()
    print ord(key)

【问题讨论】:

  • 不是'xe0',而是'\xe0'(注意反斜杠表示escape sequence)。 224 只是那个字节的十进制值:ord('\xe0') == 224
  • 太好了,谢谢。我不确定我是否只是愚蠢,或者是否应该在文档中明确说明?
  • 嗯,它docs 中,包括反斜杠 - 不知道你在说什么。
  • 是的,你是对的。我的 ide 没有显示反斜杠。

标签: python ascii msvcrt


【解决方案1】:

getch() 返回的值不是'xe0',而是'\xe0' - 请注意表示escape sequence 的反斜杠。 224 只是那个字节的十进制值:

ord('\xe0') == 224

所以在你的情况下,这应该有效:

while True:
    key = msvcrt.getch()
    if key in ('\000', '\xe0'):
        # special key, handle accordingly
        # ...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-08
    • 1970-01-01
    • 1970-01-01
    • 2010-09-15
    • 1970-01-01
    • 2010-09-16
    • 2015-06-07
    • 2016-12-08
    相关资源
    最近更新 更多