python - Reproducir animaciones en GIF con Tkinter
animation (2)
Esta pregunta ya tiene una respuesta aquí:
- Reproduce un GIF animado en python con tkinter 1 respuesta
He estado tratando de reproducir un gif animado usando
Tkinter.PhotoImage
, pero no he tenido ningún éxito.
Muestra la imagen, pero no la animación.
El siguiente es mi código:
root = Tkinter.Tk()
photo = Tkinter.PhotoImage(file = "path/to/image.gif")
label = Tkinter.Label(image = photo)
label.pack()
root.mainloop()
Muestra la imagen en una ventana, y eso es todo.
Estoy pensando que el problema tiene algo que ver con
Tkinter.Label
pero no estoy seguro.
He buscado soluciones, pero todas me dicen que use PIL (Python Imaging Library), y es algo que no quiero usar.
Con la respuesta, creé un poco más de código (que todavía no funciona ...), aquí está:
from Tkinter import *
def run_animation():
while True:
try:
global photo
global frame
global label
photo = PhotoImage(
file = photo_path,
format = "gif - {}".format(frame)
)
label.configure(image = nextframe)
frame = frame + 1
except Exception:
frame = 1
break
root = Tk()
photo_path = "/users/zinedine/downloads/091.gif"
photo = PhotoImage(
file = photo_path,
)
label = Label(
image = photo
)
animate = Button(
root,
text = "animate",
command = run_animation
)
label.pack()
animate.pack()
root.mainloop()
¡Gracias por todo! :)
Aquí hay un ejemplo más simple sin crear un objeto:
from tkinter import *
import time
import os
root = Tk()
frames = [PhotoImage(file=''mygif.gif'',format = ''gif -index %i'' %(i)) for i in range(100)]
def update(ind):
frame = frames[ind]
ind += 1
label.configure(image=frame)
root.after(100, update, ind)
label = Label(root)
label.pack()
root.after(0, update, 0)
root.mainloop()
Tienes que conducir la animación tú mismo en Tk. Un gif animado consta de varios cuadros en un solo archivo. Tk carga el primer fotograma, pero puede especificar diferentes fotogramas pasando un parámetro de índice al crear la imagen. Por ejemplo:
frame2 = PhotoImage(file=imagefilename, format="gif -index 2")
Si carga todos los marcos en PhotoImages separadas y luego usa eventos de temporizador para cambiar el marco que se muestra (
label.configure(image=nextframe)
).
El retraso en el temporizador le permite controlar la velocidad de la animación.
No se proporciona nada para proporcionarle el número de fotogramas en la imagen, salvo que no puede crear un fotograma una vez que excede el número de fotogramas.
Consulte la página del manual de la photo Tk para la palabra oficial.