我是Python的新手,我刚刚用Python制作了一个游戏和一个菜单。问题是,使用(raw_)input()要求我在每次按键后都按下Enter键,我想这样做,以便按下箭头将立即选择下一个菜单项,或者在游戏中向下移动。此刻,它要求我喜欢键入“ down”,然后按Enter。我也做了很多研究,但我不希望仅下载大型模块(例如pygame)来实现单个keyDown()方法。有没有更简单的方法,而我却找不到?
编辑: 刚发现那msvcrt.getch()可以解决问题。它不是keyDown(),但是可以工作。但是,我也不确定如何使用它,这似乎很奇怪,对您有帮助吗?这是我现在得到的:
msvcrt.getch()
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()仍然可以识别所有按键和实际按键的属性。
keyDown()
解决方案: 使用ord()-function首先将getch()int转换为整数(我想它们是虚拟键码,但不太确定),然后将结果与表示所需键的实际数字进行比较。另外,如果需要,我可以chr()在返回的数字周围添加一个额外的数字,以便将其转换为字符。但是,我主要使用向下箭头,esc等,因此将它们转换为字符会很愚蠢。这是最终代码:
ord()
getch()
chr()
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()
另外,如果其他人需要,您可以轻松地从google中找到键码,或者使用python并只需按以下键即可:
from msvcrt import getch while True: print(ord(getch()))