sábado, 3 de noviembre de 2018

Unidad No.3: Practica #24: Mostrando imagenes al azar con sonido,etiquetas y botones mediante hilos

Archivo de Python:


Ejecución del programa:

Nota: Se recomienda descargar el archivo desde el link proporcionado y ejecutarlo desde un IDE como pycharm para verificar los sonidos que se escuchan al momento de ejecutar el programa


Código: 
from Tkinter import * #para crear la GUI
from PIL import Image, ImageTk #despliegue de imagenes
import os #para dar una ruta path de una carpeta o directorio
import random #para seleccionar y dar numeros aleatorios
import pygame
import threading

root = Tk() #lo uso para la ventana de app de tkinter



def main(aux):
    while aux == 1:
        global fotos, Csonido, eleccion_aleatoria, contenedor
        dir = os.path.dirname(__file__) #lo utilizo para dar una ruta de donde estan mis imagenes
        fotos = dir + "/Imagenes/"
        Csonido=dir + "/Sonidos8/" #establece la ruta hacia los sonidos
        arreglo = [1,2,3,4,5,6,7,8] #crear un areglo con el numero de las imagenes
        eleccion_aleatoria = str(arreglo.index(random.choice(arreglo))+1) #se toma un elemento del array al azar y se hace string
        hilo1 = threading.Thread(target=et)
        hilo2 = threading.Thread(target = reproducirsonido)
        hilo3 = threading.Thread(target =img)
        hilo1.start()
        hilo2.start()
        hilo3.start()
        break

def reproducirsonido():
    sonido = Csonido + eleccion_aleatoria + ".mp3"
    pygame.mixer.init()
    pygame.mixer.music.load(sonido)
    pygame.mixer.music.play()

def img():
    global tkimage
    figura = fotos + eleccion_aleatoria + ".png" #asignas la extension png a al imagen

    #Como despliego el archivo en la ventana tk
    img = Image.open(figura) #va a la ruta de la imagen y la abre
    tkimage = ImageTk.PhotoImage(img) #despliega la imagen
    etiqueta = Label(root,image=tkimage).place(x=300,y=300) #la imagen se pone en una etiqueta

def et():
    nombre_img=Label(text = "                                      ",font =("Times New Roman",20,"bold")).place(x = 60, y = 300)
    imagenes=["Cat","Dog","House","Pencil","Holy Hand Granade","3D","Flower","Car"]
    nombre_img = Label(text = imagenes [int (eleccion_aleatoria)-1],font=("Times New Roman",20,"bold")).place(x=60,y=300)


def fin():
    root.destroy()

b1 = Button(text = "Mostrar Imagenes", command = lambda: main(1)).place(x=100, y=100)
b2 = Button(text = "Terminar programa", command = fin).place(x=200,y=200)

root.geometry("500x500")
root.mainloop()


1 comentario:

  1. Pues solo un comentario observacion.
    No dudo que el programa cumpla su función sin embargo:
    1.No es recomendable meter los hilos dentro de un ciclo repetitivo debido a la invocación repetitiva de un mismo hilo, lo cual genera errores en el compilador.
    2.Realmente el programa no necesitaba de 3 hilos, solo 1 correspondiente a realizar las 3 acciones:
    -Muestra de imagenes
    -Reproduccion de sonido
    -Cambio de texto
    Esto debido a que si alguno de ellos se adelata al poner algo en pantalla seria incongruente ver la imagen de un carro con la etiqueta perro.
    3.Veo utilizan el while, con la intencion de mostrar cada uno de estos de forma automatica, lo cual no pasa, es mas el while dado su estructura expuesta en el programa es completamente innecesario, debido al break al final de la instrucción, dicho esto sale igual quitarlo por que dara el mismo resultado.

    ResponderEliminar