Saltar a contenido

Control del teclado

El segundo paso consiste en hacer que nuestro juego esté atento a las pulsaciones en el teclado, actuando en consecuencia. Por ahora, gestionaremos la tecla Esc, que dará fin al juego y cerrará la ventana:

02CapturarTeclas.py
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
import tkinter

class Juego:
    def __init__(self, ventana):
        self.ventana = ventana

        # Configurar ventana
        self.ventana.title('Bola')
        self.ventana.resizable(False, False)
        self.ventana.wm_attributes('-topmost', True)

        # Crear lienzo
        self.lienzo = tkinter.Canvas(self.ventana,
                                     width=500,
                                     height=400,
                                     bd=0)
        self.lienzo.pack()
        self.ventana.update()

        # Indicadores
        self.terminar = False

        # Asociar eventos de teclado
        self.ventana.bind_all('<KeyPress>', self.gestionar_tecla)

    def gestionar_tecla(self,evento):
        if evento.keysym=='Escape':
            self.terminar = True

    def bucle(self):
        while True:
            if self.terminar:
                break

            self.ventana.update_idletasks()
            self.ventana.update()

v = tkinter.Tk()
juego = Juego(v)
juego.bucle()
juego.ventana.update_idletasks()
juego.ventana.destroy()

Creamos una propiedad del juego llamada terminar. En el bucle, preguntamos continuamente por ella para saber cuando finalizar las iteraciones con una sentenciabreak`

Para que tenga efecto, tenemos que ligar el evento Pulsar Tecla a la ejecución de un método que gestione esa pulsación. La asociación se hace mediante el método bind de la ventana (o de otro componente. Hay que pasarle el nombre del evento, en forma de texto, y el nombre de la función asociada.

Esta función recibe de forma automática un parámetro que representa información sobre el evento. Tratándose de un método, también recibirá una referencia a la instancia de la clase:

def gestionar_tecla(self, evento):

El evento es un objeto que tiene una propiedad con el nombre de la tecla pulsada:

if evento.keysym=='Escape':

Nombres de teclas

Podemos averiguar nombres de teclas con el siguiente programa:

Nombres_teclas.py
1
2
3
4
5
6
7
8
import tkinter

def mostrar_tecla(evento):
    print(f"'{evento.keysym}'")

ventana = tkinter.Tk()
ventana.bind_all('<KeyPress>', mostrar_tecla)
ventana.mainloop()

Pulsar sobre la ventana resultante. Al pulsar teclas, se mostrará el nombre de cada una en el shell de IDLE.