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使用正确的布局?
好吧,我必须做一些杂技才能让它发挥作用。因此,首先我建议您使用可以从 获得的按键扫描码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)