es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo puedo iterar a través de una lista de imágenes y mostrarlas en Tkinter

Entonces, mi objetivo es crear una especie de presentación de diapositivas dentro de Tkinter. Tengo una lista de imágenes como Imágenes = [“1.png”, “2.png”, …], quiero poder iterar a través de la lista y mostrar cada imagen en una ventana de Tkinter, el concepto es simple y se muestra a continuación:

  • Mostrar Imagen 1
  • Retraso de 30 segundos
  • Mostrar Imagen 2
  • Retraso de 30 segundos
  • Mostrar Imagen 3

He logrado iterar las imágenes usando una pulsación de botón, sin embargo, no quiero tener que hacer clic en un botón ya que se supone que imita una presentación de diapositivas, también intenté hacer un bucle con una función pero la función time.sleep() no se retrasa de la manera correcta debido al comportamiento de Tkinter.

He logrado lograr lo anterior utilizando en su mayoría código fuente de aquí, y agradecería un poco de ayuda para lograr lo anterior.

Mi código:

from tkinter import *
from PIL import ImageTk, Image

Ventana = Tk()
Ventana.geometry("1920x1080")
Ventana.resizable(0, 0)

Etiqueta1 = Label(Ventana)
Etiqueta1.pack()

Imágenes = iter(["1.png", "2.png", "3.png", "4.png", "5.png", 
         "6.png", "7.png", "8.png", "9.png", "10.png"])

def Siguiente_Imagen(Val):
    try:
        Imagen1 = next(Imágenes)
    except StopIteration:
        return

    Imagen1 = ImageTk.PhotoImage(Image.open(Imagen1))
    Etiqueta1.Image = Imagen1
    Etiqueta1["image"] = Imagen1

Boton1 = Button(text = "Siguiente imagen", command = 
lambda:Siguiente_Imagen(1))
Boton1.place(x = 50, y = 50)

Siguiente_Imagen(1)

Ventana.mainloop()

También intenté usar .after(), sin embargo, no mostraba cada imagen, saltaba directamente de la primera imagen a la última de inmediato con el retraso acumulado.

for x in range(1, 11):

    Ventana.after(1000, lambda : Siguiente_Imagen(1))
Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para crear una presentación de diapositivas dentro de Tkinter, puedes usar el método .after() en lugar de presionar un botón para iterar a través de la lista de imágenes. Aquí tienes una versión actualizada del código que proporcionaste:

    from tkinter import *
    from PIL import ImageTk, Image
    
    Window = Tk()
    Window.geometry("1920x1080")
    Window.resizable(0, 0)
    
    Label1 = Label(Window)
    Label1.pack()
    
    Images = iter(["1.png", "2.png", "3.png", "4.png", "5.png", "6.png", "7.png", "8.png", "9.png", "10.png"])
    
    def Next_Image():
        try:
            Image1 = next(Images)
        except StopIteration:
            return
    
        Image1 = ImageTk.PhotoImage(Image.open(Image1))
        Label1.Image = Image1
        Label1["image"] = Image1
    
        # Llamar a Next_Image() nuevamente después de un retraso de 30 segundos
        Window.after(30000, Next_Image)
    
    Next_Image()
    
    Window.mainloop()
    

    En esta versión, la función Next_Image() se llama automáticamente usando el método .after() con un retraso de 30 segundos. La función itera a través de la lista de imágenes, muestra cada una en la ventana de Tkinter usando una Label y configura una nueva llamada a Next_Image() con otro retraso de 30 segundos.

    Ten en cuenta que la variable global Images se usa dentro de la función Next_Image() sin ser pasada como argumento. Esto se debe a que la variable Images se define en el ámbito global y es accesible desde dentro de la función. Sin embargo, debes tener cuidado al definir variables globales para evitar conflictos en los nombres y modificaciones no intencionales de variables.

Comments are closed.