我是Python的新手,我只是用Python做了一个游戏和一个菜单。 问题是,使用(raw_)input()需要我在每次按键之后按下回车键,我想这样做是为了按下向下箭头将立即select下一个菜单项,或者在游戏中向下移动。 此刻,它需要我喜欢types“下”,然后按回车。 我也做了大量的研究,但是我不想下载大型的模块(比如pygame)来实现一个keyDown()方法。 那么有没有更简单的方法,我找不到?
编辑:刚刚发现, msvcrt.getch()
会做的伎俩。 这不是keyDown(),但它的工作原理。 但是,我不知道如何使用它,似乎很奇怪,在这里有什么帮助? 这是我现在所得到的:
from msvcrt import getch while True: key = getch() print(key)
但是,它一直给我所有这些无意义的字节,例如,向下箭头是这样的:
b'\xe0' b'P'
我不知道如何使用它们,我试图用chr()来比较,甚至使用ord(),但是不能做任何比较。 我想要做的基本上是这样的:
from msvcrt import getch while True: key = getch() if key == escape: break elif key == downarrow: movedown() elif key == 'a': ...
等等…有什么帮助?
通过自己测试所有的东西来找出它。 找不到关于它的任何主题,所以我只是在这里留下解决方案。 这可能不是唯一的,甚至是最好的解决方案,但它适用于我的目的(在getch的限制之内),总比没有好。
注意:适当的keyDown()
可以识别所有的按键和实际的按键,仍然值得。
解决方案:使用ord()
函数将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()
此外,如果有人需要,你可以很容易地从谷歌找到的keycodes,或通过使用python,只需按下键:
from msvcrt import getch while True: print(ord(getch()))
请参阅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之前。
from msvcrt import getch pos = [0, 0] def fright(): global pos pos[0] += 1 def fleft(): global pos pos[0] -= 1 def fup(): global pos pos[1] += 1 def fdown(): global pos pos[1] -= 1 while True: print'Distance from zero: ', pos key = ord(getch()) if key == 27: #ESC break elif key == 13: #Enter print('selected') elif key == 32: #Space print('jump') elif key == 224: #Special keys (arrows, f keys, ins, del, etc.) key = ord(getch()) if key == 80: #Down arrow print('down') fdown elif key == 72: #Up arrow print('up') fup() elif key == 75: #Left arrow print('left') fleft() elif key == 77: #Right arrow print('right') fright()