Mostrando entradas con la etiqueta Evento. Mostrar todas las entradas
Mostrando entradas con la etiqueta Evento. Mostrar todas las entradas

miércoles, 9 de julio de 2025

Gráficos. Python

PyGame. Eventos de ratón


Los eventos de ratón afectan a los botones, la rueda y el desplazamiento del ratón por la superficie. Los dos primeros son similares a los de teclado (presionar - soltar), pero el de desplazamiento o movimiento ofrece otras posibilidades.


Veamos en primer lugar los que afectan a los botones (1 - 2 - 3) y a la rueda (4 - 5) y a su estado (MOUSEBUTTONDOWN vs MOUSEBUTTOMUP)

elif event.type == pygame.MOUSEBUTTONDOWN:
            print("Botón del mouse presionado:", event.button)
            if event.button == 1:
                print ("Se ha pulsado el botón izquierdo del ratón (botón ",event.button,")")
            elif event.button == 2:
                print ("Se ha pulsado el botón central del ratón (botón ",event.button,")")
            elif event.button == 3:
                print ("Se ha pulsado el botón derecho del ratón (botón ",event.button,")")
            elif event.button == 4:
           print ("Se ha accionado la rueda del botón hacia delante (evento ratón ",event.button,")") 
            elif event.button == 5:
              print ("Se ha accionado la rueda del botón hacia atrás (evento ratón ",event.button,")") 

Una vez capturado el evento  MOUSEBUTTONDOWN MOUSEBUTTONUP (v.g. event.type == pygame.MOUSEBUTTONDOWN), podemos identificar el botón pulsado (event.button) y, tomando como referencia la equivalencia entre identificador numéricos (v.g. if event.button == 1:) ...

  • 1 para el botón izquierdo
  • 2 para el central
  • 3 para el derecho
  • 4 para el avance de la rueda
  • y 5 para el retroceso
...  asociarlo a alguna acción o conjunto de acciones (en el ejemplo print ("Se ha pulsado el botón izquierdo del ratón (botón ",event.button,")") ).

Las posibilidades de trabajo con este procedimiento es similar al que tenemos con la identificación de los eventos de teclado (aunque es dudoso que podemos desarrollar procedimientos complejos, a modo de paneles de control), pero las que nos ofrece la captura del desplazamiento del ratón (pygame.MOUSEMOTION:)...

if event.type == pygame.MOUSEMOTION:
    print(f'Ratón movido a {event.pos} ')

...  nos abren un amplio mundo de opciones (antes sólo print(f'Ratón movido a {event.pos} ')) una vez que capturamos los valores numéricos de las posiciones cartesianas x - y, como es el caso del [script que sigue]...

import pygame

# Inicializar Pygame

pygame.init() 

# Configurar la pantalla

window_size = ( 800 , 600 ) 

screen = pygame.display.set_mode(window_size) 

pygame.display.set_caption( 'Ejemplo de posición del mouse' ) 

# Configurar la fuente para mostrar texto

font = pygame.font.Font( None , 36 ) 

# Bucle principal (game loop)

running = True 

while running:

#Captura todos los eventos que suceden en la ventana

    for event in pygame.event.get():

#Captura evento de ventana (QUIT) para cerrarla

        if event.type == pygame.QUIT:

            running = False

# Rellena la pantalla con blanco (RGB 255,255,255)

    screen.fill(( 255 , 255 , 255 ))

# Obtiene la posición actual del mouse...

    x, y = pygame.mouse.get_pos()

# ... y la presenta en el texto en color rojo (RGB 250,0,0)

    text = font.render( f'Posición del puntero del ratón: {x} - {y}' , True , ( 250 , 0 , 0 ))

# Redibuja el texto en la pantalla...

    screen.blit(text, ( 20 , 20 ))

#... y la actualiza

    pygame.display.flip()

# Salir de Pygame

pygame.quit() 

... que es sólo un ejercicio sin pretensiones de utilidad práctica, pero que nos permite pensar en posibilidades de aplicación como mapas, cronogramas, gráficos interactivos...

Gráficos. Python

PyGame. Eventos de teclado


Los eventos de teclado permiten identificar las teclas sobre las que ha pulsado el usuario. A partir de ahí podemos transformar este conocimiento en una forma de interacción entre el usuario y el programa.


Vamos a ver en esta entrada las formas en las que podemos capturar estos eventos. Algunas de ellas ya son conocidas, aunque no nos detuvimos especialmente en explicarlas. Por ejemplo, el modo en el que controlamos la ruptura del game loop:

running = True
while running:
    for event in pygame.event.get():
#Capturamos el evento ventana para cerrar el bucle
        if event.type == pygame.QUIT:
            running = False

Después de capturar los eventos mediante un for  con la función event.get() (for event in pygame.event.get():), controlamos el evento pygame.QUIT para generar la ruptura del bucle, modificando el valor de la variable que lo controla (running = False) mediante el condicional (if event.type == pygame.QUIT:).

Pero en sentido estricto (el anterior es un evento de ventana), los eventos de teclado (pygame.KEYUP pygame.KEYDOWN ) se refieren al control de qué tecla ha sido pulsada o liberada, identificándola por su "nombre" ( if event.key == pygame.K_f:)...

elif event.type == pygame.KEYUP:
            if event.key == pygame.K_f:
                print ("Hemos presionado la tecla f")

... o por su código o número (if event.key == 97:)

elif event.type == pygame.KEYDOWN:
            if event.key == 97:
                print("Tecla presionada la tecla A (", event.key,")")

Otra cosa es qué hagamos con ese control. De momento nos sirve únicamente para identificar la tecla, a fin de centrar la explicación en el propio evento. En posteriores desarrollos veremos posibles aplicaciones; por ahora apuntar únicamente que, gracias al control de los eventos de teclado podríamos construir teclados orientados a funciones específicas, a modo de paneles de control. Este ya es un tema que requiere algo de bricolaje informático, no sólo programación.

Gráficos. Python

PyGame. Eventos


Dentro de la ventana del juego (o de la pantalla, si se prefiere) se producen eventos que resultan de la acción del usuario sobre los elementos que sirven de interfaz, como son el teclado y el ratón.


En PyGame, la función pygame.event.get() devuelve una lista de todos los eventos que suceden en pantalla, que son los siguientes:

- pygame.QUIT -> Cierre de ventana (pulsando la [X] de la ventana)

Eventos de teclado:

- pygame.KEYDOWN -> Cuando se presiona una tecla.
- pygame.KEYUP -> Cuando se suelta una tecla.

Eventos de ratón:

- pygame.MOUSEBUTTONDOWN -> Cuando se presiona un botón del ratón.
- pygame.MOUSEBUTTOMUP -> Cuando se suelta un botón del ratón.
- pygame.MOUSEMOTION -> Cuando el ratón se mueve.

Eventos de joystick:

- pygame.JOYAXISMOTION -> Cuando se mueve un eje del joystick.
- pygame.JOYBUTTONDOWN -> Cuando se presiona un botón del joystick.
- pygame.JOYBUTTONUP -> Cuando se suelta un botón del joystick.

Para mostrar en consola los eventos usamos la función print(event). Algunos de ellos son los siguientes:

Algunos eventos de ventana:

<Event(4352-AudioDeviceAdded {'which': 0, 'iscapture': 0})>
<Event(4352-AudioDeviceAdded {'which': 0, 'iscapture': 1})>
<Event(32774-WindowShown {'window': None})>
<Event(32768-ActiveEvent {'gain': 1, 'state': 2})>
<Event(32785-WindowFocusGained {'window': None})>
<Event(770-TextEditing {'text': '', 'start': 0, 'length': 0, 'window': None})>
<Event(32783-WindowEnter {'window': None})>

Algunos eventos de ratón:

<Event(1024-MouseMotion {'pos': (605, 211), 'rel': (0, 0), 'buttons': (0, 0, 0), 'touch': False, 'window': None})>
<Event(1024-MouseMotion {'pos': (615, 207), 'rel': (10, -4), 'buttons': (0, 0, 0), 'touch': False, 'window': None})>

Algunos eventos de teclado:

<Event(768-KeyDown {'unicode': '1', 'key': 49, 'mod': 0, 'scancode': 30, 'window': None})>
<Event(771-TextInput {'text': '1', 'window': None})>
<Event(769-KeyUp {'unicode': '1', 'key': 49, 'mod': 0, 'scancode': 30, 'window': None})>
<Event(768-KeyDown {'unicode': '2', 'key': 50, 'mod': 0, 'scancode': 31, 'window': None})>
<Event(771-TextInput {'text': '2', 'window': None})>
<Event(769-KeyUp {'unicode': '2', 'key': 50, 'mod': 0, 'scancode': 31, 'window': None})>
<Event(768-KeyDown {'unicode': '3', 'key': 51, 'mod': 0, 'scancode': 32, 'window': None})>

Lo interesante de los eventos es que su control mediante código nos permiten desarrollar interacciones entre el usuario y el programa. Algunos ejemplos de formas de uso serán tratadas en posteriores entradas.