Pygame: ¿Hay alguna manera fácil de encontrar la letra / número de CUALQUIER alfanumérico pulsado?

El juego en el que estoy trabajando actualmente necesita permitir que las personas tengan tiempo en su nombre para el tablero de mejores puntuaciones. Estoy un poco familiarizado con la forma de manejar las pulsaciones de teclas, pero solo he tratado con la búsqueda de las específicas. ¿Hay una manera fácil de presionar la letra de una tecla sin tener que hacer algo como esto:

for event in pygame.event.get(): if event.type == KEYUP: if event.key == K_a: newLetter = 'a' elif event.key == K_b: newLetter = 'b' ... elif event.key == K_z: newLetter = 'z' 

Si bien eso funcionaría, tengo la sensación de que hay una manera más eficiente de hacerlo. Simplemente no puedo entenderlo o encontrar alguna guía en él.

Hay básicamente dos formas:

Opción 1: usar pygame.key.name() .

Es tan simple como

 for event in pygame.event.get(): if event.type == pygame.KEYDOWN: print(pygame.key.name(event.key)) 

La ventaja sobre el uso de chr es que chr solo funciona si el valor de event.key está entre 0 y 255 (inclusive).

Si presiona menu , Alt Gr , Tab o LShift , pygame.key.name alegremente devolverá menu , alt gr , tab y left shift , mientras que chr se bloqueará, bloqueará, devolverá espacios en blanco y se bloqueará.


Opción 2: usar el atributo unicode del evento pygame.KEYDOWN

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

Cuando use una tecla de función, obtendrá la letra / número o una cadena vacía, y también tendrá en cuenta los modificadores, por ejemplo, si mantiene presionada la tecla Mayús mientras presiona a, devolverá A lugar de solo a .

El evento pygame.KEYDOWN tiene atributos adicionales unicode y scancode. Unicode representa una cadena de caracteres única que es el carácter completamente traducido ingresado. Esto tiene en cuenta las teclas de cambio y composición. Scancode representa el código clave específico de la plataforma.

Si miras, K_a tiene solo 97, ese es el código ASCII para ‘a’, ¿lo extrapolaré a K_? Es el código ASCII para lo que represente el signo de interrogación.

 if event.type == KEYUP: print chr(event.key) #convert ascii code to a character 

¿tal vez?

como se señaló, esto no funcionará con ascii en más de 255 (en realidad no es ascii)

puede usar el método descrito a continuación o simplemente usar unichr(event.key) lugar de chr