web-dev-qa-db-fra.com

Jouer des animations en GIF avec Tkinter

J'ai essayé de jouer un gif animé en utilisant Tkinter.PhotoImage, mais sans succès. Il affiche l'image, mais pas l'animation. Voici mon code:

root = Tkinter.Tk()
photo = Tkinter.PhotoImage(file = "path/to/image.gif")
label = Tkinter.Label(image = photo)
label.pack()
root.mainloop()

Il affiche l'image dans une fenêtre, et c'est tout. Je pense que le problème a quelque chose à voir avec Tkinter.Label mais je ne suis pas sur. J'ai cherché des solutions mais ils me disent tous d'utiliser PIL (Python Imaging Library), et c'est quelque chose que je ne veux pas utiliser.

Avec la réponse, j'ai créé un peu plus de code (qui ne fonctionne toujours pas ...), le voici:

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()

Merci pour tout! :)

11
Zizouz212

Vous devez piloter l'animation vous-même dans Tk. Un gif animé se compose d'un certain nombre d'images dans un seul fichier. Tk charge la première image mais vous pouvez spécifier différentes images en passant un paramètre d'index lors de la création de l'image. Par exemple:

frame2 = PhotoImage(file=imagefilename, format="gif -index 2")

Si vous chargez toutes les images dans des images photo distinctes, puis utilisez des événements de minuterie pour changer l'image affichée (label.configure(image=nextframe)). Le retard sur la minuterie vous permet de contrôler la vitesse d'animation. Il n'y a rien de prévu pour vous donner le nombre d'images dans l'image, sauf s'il ne parvient pas à créer une image une fois que vous avez dépassé le nombre d'images.

Voir la page de manuel photo Tk pour le Word officiel.

8
patthoyts

Voici un exemple plus simple sans créer d'objet:

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()
5
Alex