Windows-阅读按键的Python方法?
我是Python的新手,我刚刚用Python制作了一个游戏和一个菜单。问题是,使用(raw_)input()要求我在每次按键后都按Enter键,我想这样做,以便按向下箭头将立即选择下一个菜单项,或者在游戏中向下移动。 此刻,它要求我喜欢键入“ down”,然后按Enter。 我也做了很多研究,但我不想仅下载大型模块(例如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':
...
等等...有什么帮助吗?
4个解决方案
60 votes
通过自己测试所有内容来弄清楚。找不到关于它的任何主题,所以我将解决方案留在这里。 这可能不是唯一的,甚至不是最好的解决方案,但是它对我来说是可行的(在getch的限制内),总比没有好。
注意:仍然可以识别所有按键和实际按键的正确的ord()。
解决方案:使用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()
另外,如果其他人需要,您可以轻松地从google中找到键码,或者使用python并只需按以下键即可:
from msvcrt import getch
while True:
print(ord(getch()))
kres0345 answered 2020-07-24T22:26:01Z
10 votes
请参阅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之前。
Mark Tolonen answered 2020-07-24T22:26:34Z
1 votes
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()
Tommy L answered 2020-07-24T22:26:50Z
1 votes
我真的不想将此发表为评论,因为我需要评论所有答案和原始问题。
所有答案似乎都依赖于MSVCRT Microsoft Visual C运行时。如果您想避免这种依赖性:
如果需要跨平台支持,请在此处使用库:
[HTTPS://皮衣皮.org/project/隔天可以/#files]
[HTTPS://GitHub.com/堪称洒芬芳/隔天可以]
可以提供更优雅的解决方案。
代码示例:
from getkey import getkey, keys
key = getkey()
if key == keys.UP:
... # Handle the UP key
elif key == keys.DOWN:
... # Handle the DOWN key
elif key == 'a':
... # Handle the `a` key
elif key == 'Y':
... # Handle `shift-y`
else:
# Handle other text characters
buffer += key
print(buffer)
Ken answered 2020-07-24T22:27:36Z