Pygame键盘布局混乱

Mag*_*ohn 6 python dvorak pygame keyboard-events

我使用的是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)
Run Code Online (Sandbox Code Playgroud)

箭头键可以正常工作,但WASD键以与Dvorak一致的方式分布在键盘上.因此,"A"在两个布局上都在同一个位置,"W"在QWERTY的逗号键上,依此类推.如果我更改代码来寻找a,e,,o键代替,工作的事情如预期.

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

Mar*_*agh 3

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

代码

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]
Run Code Online (Sandbox Code Playgroud)

输出

keydown d pressed
keyup d pressed
keydown e pressed
keyup e pressed
Run Code Online (Sandbox Code Playgroud)