Pygame的键盘布局混了(Pygame keyboard layouts mixed up)

2019-07-04 02:09发布

我在Mac OS X 10.6,和我有德沃夏克,美国延长,挪威在我的键盘输入选择菜单,和美国扩展是我使用的一个。

当我运行Pygame的程式与键盘输入,pygame的,似乎我使用德沃夏克不管什么是真正的选择思考。

这是采用键盘输入代码的一部分:

    # 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键分布在键盘与德沃夏克一致的方式。 因此,“A”是在这两种布局相同的地方,“W”是对QWERTY的逗号键,等等。 如果我更改代码来寻找ae,o键代替,工作的事情如预期。

我怎样才能让pygame的使用正确的布局?

Answer 1:

好吧,我不得不做一些杂技得到这个工作。 因此,首先,我建议你使用的键扫描码 ,你可以从得到event.scancode 。 每个键都有一个唯一的代码,指的是键盘上的物理按键,并不管你的键盘布局德沃夏克或我们这是相同的扫描码。 然后在keydown事件,你将有一个属性,叫做unicode的是尊重当前使用的键盘布局按下的字符。 因此,压在我们布局d键让你的unicode d,在德沃夏克物理键会让你E字符,这得到正确反映event.unicode 。 这里的地方就有点讨厌。 这似乎unicode的属性只在keydown事件,而不是keyup事件可用。 所以,我只是创建了一个名为字典键盘映射持续跟踪这一信息的扫描码到Unicode字符映射。 下面的示例代码将打印出你按下考虑到键盘布局的字符。 你可以尝试一下,即使您切换程序执行过程中的键盘布局,它仍然拿起右键。 你看到下面的输出是我按d键布局我们切换到德沃夏克按相同的密钥和正确地得到了E中的会话。 并脱帽向您使用德沃夏克的方式优于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]

产量

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


文章来源: Pygame keyboard layouts mixed up