python 功能键ord_Windows-阅读按键的Python方法?

这篇博客讨论了在Python中使用msvcrt.getch()函数读取键盘输入,特别是如何处理箭头键和其他特殊键。作者遇到的问题是原始输入需要配合Enter键才能生效,而目标是直接响应按键。解决方案包括解析getch()返回的字节并使用ord()转换为键码进行比较。
摘要由CSDN通过智能技术生成

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值