Pygame键盘布局混乱



我使用的是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的逗号键上,依此类推。如果我更改代码以查找ae,o键,事情就会如预期的那样进行。

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

好吧,我必须做一些杂技才能完成这项工作。因此,首先我建议您使用可以从event.scancode获得的密钥扫描码。每个键都有一个唯一的代码,指向键盘上的物理键,无论您的键盘布局是dvorak还是我们,这都是相同的扫描代码。然后在keydown事件中,您将有一个名为unicode的属性,它是根据当前使用的键盘布局按下的字符。因此,在us布局上按d键可以获得unicode d,在dvorak上,物理键可以获得e字符,这在event.unicode中得到了正确的反映。这就是它变得有点烦人的地方。unicode属性似乎只在keydown事件中可用,而在keyup事件中不可用。所以我简单地创建了一个名为keymap的字典,它将这些信息作为扫描码到unicode字符的映射来跟踪。下面的示例代码将打印出您在考虑键盘布局的情况下按下的字符。你可以尝试一下,即使你在程序执行期间切换键盘布局,它仍然会选择正确的键。你在下面看到的输出是一个会话,在这个会话中,我按下了我们布局中的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]

输出

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

接受的答案是正确的,但为了简洁起见,这里是解决方案:

if event.type == pygame.KEYDOWN:
print(event.unicode)

最新更新