用于读取按键的Python方法?

44 python windows key getch keydown

我是Python的新手,我只是用Python创建了一个游戏和一个菜单.问题是,使用(raw_)input()要求我在每次按键后按Enter键,我想按下向下箭头将立即选择下一个菜单项,或者在游戏中向下移动.目前,它需要我喜欢键入"向下"然后按Enter键.我也做了很多研究,但我不想下载大型模块(例如pygame)来实现单个keyDown()方法.那么有什么更简单的方法,我找不到?

编辑: 刚刚发现可以解决这个问题msvcrt.getch().它不是keyDown(),但它有效.但是,我不知道如何使用它,这看起来很奇怪,这里有什么帮助吗?这就是我现在所得到的:

from msvcrt import getch
while True:
    key = getch()
    print(key)
Run Code Online (Sandbox Code Playgroud)

但是,它一直给我所有这些无意义的字节,例如,向下箭头是这样的:

b'\xe0'
b'P'
Run Code Online (Sandbox Code Playgroud)

我不知道如何使用它们,我试图与chr()进行比较,甚至使用ord(),但不能真正进行任何比较.我想要做的基本上是这样的:

from msvcrt import getch
while True:
    key = getch()
    if key == escape:
        break
    elif key == downarrow:
        movedown()
    elif key == 'a':
        ...
Run Code Online (Sandbox Code Playgroud)

等等......有什么帮助吗?

小智 61

通过自己测试所有的东西来计算它.找不到任何关于它的话题,所以我将在这里留下解决方案.这可能不是唯一的甚至是最好的解决方案,但它适用于我的目的(在getch的限制范围内)并且总比没有好.

注意:正确keyDown()识别所有按键和实际按键的功能仍然很有价值.

解决方案:使用ord()-function首先将其getch()转换为整数(我猜它们是虚拟键码,但不太确定)工作正常,然后将结果与表示所需键的实际数字进行比较.此外,如果我需要,我可以chr()在返回的数字周围添加额外的数据,以便将其转换为字符.但是,我主要使用向下箭头,esc等,所以将它们转换为角色将是愚蠢的.这是最终的代码:

from msvcrt import getch
while True:
    key = ord(getch())
    if key == 27: #ESC
        break
    elif key == 13: #Enter
        select()
    elif key == 224: #Special keys (arrows, f keys, ins, del, etc.)
        key = ord(getch())
        if key == 80: #Down arrow
            moveDown()
        elif key == 72: #Up arrow
            moveUp()
Run Code Online (Sandbox Code Playgroud)

此外,如果其他人需要,您可以轻松地从谷歌找到密钥代码,或使用python,只需按下键:

from msvcrt import getch
while True:
    print(ord(getch()))
Run Code Online (Sandbox Code Playgroud)

  • 谢谢,这是第一个对我有用的答案.+1 (3认同)
  • @AnumSheraz上述方法仅在从命令提示符运行代码时有效. (3认同)

Mar*_*nen 10

请参阅MSDN getch文档.特别:

_getch和_getwch函数从控制台读取单个字符而不回显字符.这些函数都不能用于读取CTRL + C. 读取功能键或箭头键时,每个功能必须调用两次; 第一个调用返回0或0xE0,第二个调用返回实际的键代码.

Python函数返回一个字符.例如,您可以使用ord()获取可以测试的整数值keycode = ord(msvcrt.getch()).

因此,如果您读取0x00或0xE0,请再次读取它以获取箭头或功能键的键代码.根据实验,0x00在F1-F10(0x3B-0x44)之前,0xE0在箭头键和Ins/Del/Home/End/PageUp/PageDown之前.