gpt4 book ai didi

python - Pygame 键盘布局混淆

转载 作者:太空狗 更新时间:2023-10-30 00:17:55 33 4
gpt4 key购买 nike

我使用的是 Mac OS X 10.6,在我的键盘输入选择器菜单中有 Dvorak、US Extended 和 Norwegian,而我使用的是 US Extended。

当我使用键盘输入运行 Pygame 程序时,pygame 似乎认为我正在使用 dvorak 不管实际选择了什么。

这是接受键盘输入的代码部分:

    # Check for events
for event in pygame.event.get():
if event.type == KEYDOWN:
# Change the keyboard variables
if event.key == K_LEFT or event.key == ord('a'):
moveRight = False
moveLeft = True
if event.key == K_RIGHT or event.key == ord('d'):
moveLeft = False
moveRight = True
if event.key == K_UP or event.key == ord('w'):
moveDown = False
moveUp = True
if event.key == K_DOWN or event.key == ord('s'):
moveUp = False
moveDown = True
if event.type == KEYUP:
if event.key == K_ESCAPE:
pygame.quit()
sys.exit()
if event.key == K_LEFT or event.key == ord('a'):
moveLeft = False
if event.key == K_RIGHT or event.key == ord('d'):
moveRight = False
if event.key == K_UP or event.key == ord('w'):
moveUp = False
if event.key == K_DOWN or event.key == ord('s'):
moveDown = False
if event.key == ord('x'):
player.top = random.randint(0, WINDOWHEIGHT - player.height)
player.left = random.randint(0, WINDOWWIDTH - player.width)

箭头键可以正常工作,但 WASD 键以与 Dvorak 一致的方式分布在键盘上。因此,“A”在两种布局中的位置相同,“W”在 QWERTY 的逗号键上,依此类推。如果我更改代码以查找 aeo 键,则一切正常预期。

如何让 Pygame 使用正确的布局?

最佳答案

好吧,我必须做一些杂技才能让它工作。所以首先我建议你使用 key scancode您可以从 event.scancode 中获取。每个键都有一个唯一代码,指的是键盘上的物理键,无论您的键盘布局是德沃夏克还是我们,这都是相同的扫描码。然后在 keydown 事件上你将有一个名为 unicode 的属性,它是按下的字符,它符合当前使用的键盘布局。因此,在 us 布局上按 d 键会得到 unicode d,在 dvorak 上,该物理键会得到 e 字符,这会正确反射(reflect)在 event.unicode 中。这就是它有点烦人的地方。似乎 unicode 属性仅适用于 keydown 事件而不适用于 keyup 事件。所以我简单地创建了一个名为 keymap 的字典,用于跟踪此信息作为 scancode 到 unicode 字符的映射。考虑到键盘布局,下面的示例代码将打印出您按下的字符。您可以尝试一下,即使您在程序执行期间切换键盘布局,它仍然会选择正确的键。您在下面看到的输出是一个 session ,我在 us 布局中按下 d 键切换到 dvorak 按下相同的键并正确获得 e。向你致敬,因为它比 qwerty 更好地使用了 dvorak,我也用它:)

代码

import pygame, os
from pygame.locals import *

pygame.init()
screen = pygame.display.set_mode((640, 480))
keymap = {}

while True:
event = pygame.event.wait()
if event.type == KEYDOWN:
keymap[event.scancode] = event.unicode
print 'keydown %s pressed' % event.unicode
if (event.key == K_ESCAPE):
os._exit(0)

if event.type == KEYUP:
print 'keyup %s pressed' % keymap[event.scancode]

输出

keydown d pressed
keyup d pressed
keydown e pressed
keyup e pressed

关于python - Pygame 键盘布局混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13528951/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com