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

domingo, 20 de abril de 2025

Evaluación. Soportes.

Presentación PyGame


Muy cierto, PyGame es una librería para desarrollar juegos 2-D, no para crear presentaciones, que para eso ya está [Python-pptx], pero no: con PyGame también podemos crear generadores sencillos de presentaciones (simples, al menos de momento); con sus limitaciones, pero también con unas funcionalidades que no son sencillas de implementar mediante Python-pptx.


Ahora que ya tenemos ciertos conocimientos sobre PyGame vamos a aprovechar para mostrar algunas posibilidades de uso que no son expuestas en la literatura sobre esta biblioteca (al menos, no en mis indagaciones) y que, aun con sus limitaciones, me ha parecido de interés. De paso demostramos que no todo en PyGame se basa en el bucle infinito... en un bucle sí, pero delimitado.

Una de esas posibles utilidades de PyGame consiste en utilizarlo para crear un "presentador" de contenidos audiovisuales. Cierto que en la acepción más 'pobre' pero estricta del término: unión de imágenes y sonidos en sucesión; vamos, lo que llamamos presentación básica de diapositivas. Cierto que limitada (reitero), pero no menos que la mayoría de las presentaciones que realizamos con LO-Impress (o Power point)... o las que aprendimos a crear con Python-pptx no hace mucho.

Aprovechando lo que [hemos aprendido recientemente sobre PyGame] (y siguiente) voy a desarrollar un script que nos permite visualizar una colección de imágenes que se muestran acompañadas de sonido. Se trata de un recurso para aprender palabras (vocabulario o léxico, si se prefieren expresiones más técnicas) y que perfectamente podría implementarse como sencillo cuenta-cuentos, o como la base para una actividad de comprensión oral, o...

Dejemos las posibilidades para otro momento y centrémonos en lo concreto. Este es el script que paso a comentarte con detalle a continuación.

import pygame

#Inicializar pygame y pygame.audio
pygame.init()
pygame.mixer.init()

#Componentes MAV
nombres = ("coche","platano","oso","reloj","tijeras","tenedor","estrella","escalera","escoba","cepillo")

#Constantes ventana
ANCHO = 1024 #Tamaño
ALTO = 768
BLANCO = (255,255,255) #Color

#Creación de ventana
ventana = pygame.display.set_mode((ANCHO,ALTO))
ventana.fill(BLANCO)
pygame.display.set_caption('NOMBRES. Conocimiento léxico')

#Bucle for para recorrer la lista de componentes (img y aud)

for i in range(0,10):

    #Imagen
    img_v = "assets/img/" + nombres[i] + ".jpg"
    img = pygame.image.load(img_v)
    img_bis = pygame.transform.scale(img.convert(), (ANCHO,ALTO))
    ventana.blit(img_bis,(0,0))

    # Audio
    aud = "assets/audio/" + nombres[i] + ".mp3"
    pygame.mixer.music.load(aud)
    pygame.mixer.music.play(0)
    pygame.mixer.music.set_volume(0.5)

    #Actualizar ventana
    pygame.display.update()
    #Tiempo visualización
    pygame.time.delay(2000)

pygame.quit()

Como puedes ver, este script se divide en tres partes:
  • La primera va desde el inicio (import pygame) hasta el for
  • La segunda desarrolla el ciclo for (for i in range(0,10):)
  • Y la tercera se ocupa del cierre del programa (pygame.quit())
Respecto a entradas anteriores, la diferencia de la actual, en lo que al inicio se refiere, es la presencia de una tupla que contiene los nombres de los archivos auxiliares (img y aud) que previamente he almacenado en el directorio assets con nombres acordes a los que ahora reproduzco en dicha tupla. Esto me ahorra tener que crear dos tuplas, una para img y otra para aud. Pequeño truquito para trabajar menos.

Con todo, lo que realmente hace que funcione nuestro programa es el uso del bucle for que, como se puede apreciar, se subdivide a su vez en tres partes:
  • En la primera (II.a) trabajamos con las imágenes
  • En la segunda (II.b) con los sonidos
  • Y en la tercera (II.c) actualizamos ventana (pygame.display.update()) y establecemos tiempo de visionado (pygame.time.delay(2000)). Por cierto, podríamos incluir una tercera tupla con los tiempos de duración de los audios y usarlos como parámetros de time.delay(). Sería una interesante propuesta de mejora.
El código de trabajo con img y aud ya es conocido de entradas anteriores: el de img de cuando planteamos usar una imagen como [fondo de pantalla] y el de sonido de [esta entrada], pero en ambas constituye 'novedad' el uso de sendas variables construidas mediante concatenación (vg.img_v = "assets/img/" + nombres[i] + ".jpg") aprovechando la variable contador del bucle. Estas variables son las que se emplean en la instrucción correspondiente (vg. pygame.mixer.music.load(aud)) para cargar respectivamente img y aud.

Y con esto está explicado todo: gracias al bucle, vamos actualizando img y aud para que, tras un lapso de tiempo, se visualicen en la ventana (y se escuchen) los objetos que cargamos en ella de modo secuencial. 

Documento. [Aquí te dejo enlace] para que descargues script y archivos de imágenes y audios.  Se trata de una archivo comprimido que deberás descomprimir, respetando eso sí la estructura de carpetas.