Disposiciones de teclado Pygame mezcladas

Estoy en Mac OS X 10.6, y tengo Dvorak, US Extended y Norwegian en el menú de selección de entrada de mi teclado, y US Extended es el que uso.

Cuando ejecuto progtwigs de Pygame con entrada de teclado, pygame parece pensar que estoy usando dvorak independientemente de lo que esté seleccionado.

Esta es la parte del código que toma la entrada del teclado:

# 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) 

Las teclas de flecha funcionan como deberían, pero las teclas WASD están repartidas en el teclado de forma compatible con Dvorak. Entonces, “A” está en el mismo lugar en ambos diseños, “W” está en la tecla de coma de QWERTY, y así sucesivamente. Si cambio el código para buscar las teclas a, e yo en su lugar, las cosas funcionan como se espera.

¿Cómo puedo hacer que Pygame use el diseño correcto?

Ok, tuve que hacer algunas acrobacias para que esto funcione. Así que primero te recomiendo que uses el código de clave que puedes obtener de event.scancode . Cada tecla tiene un código único que se refiere a la tecla física en el teclado y este es el mismo código de escena independientemente de la distribución de teclado o de nosotros. Luego, en el evento keydown, tendrá un atributo llamado Unicode, que es el carácter que se presiona y que respeta el diseño de teclado actual en uso. Por lo tanto, al presionar la tecla d en un diseño de Estados Unidos se obtiene unicode d, en dvorak esa tecla física le dará el carácter e y esto se reflejará correctamente en event.unicode . Aquí es donde se pone un poco molesto. Parece que el atributo Unicode solo está disponible en el evento keydown y no en el evento keyup. Así que simplemente creé un diccionario llamado mapa de teclas que realiza un seguimiento de esta información como una asignación de scancode a unicode. El siguiente código de ejemplo imprimirá el carácter que presionó teniendo en cuenta la distribución del teclado. Puedes probarlo, incluso si cambias la distribución del teclado durante la ejecución del progtwig, sigue seleccionando la tecla correcta. La salida que se ve a continuación es una sesión en la que presioné la tecla d en nosotros. La disposición cambiada a dvorak presionó la misma tecla y obtuve la e correctamente. Y felicitaciones a usted por usar dvorak a su manera mejor que qwerty, yo también lo uso 🙂

código

 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] 

salida

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