Воспроизведение анимации в GIF с помощью Tkinter [дубликат]

этот вопрос уже есть ответ здесь:

Я пытался играть в анимированный gif с помощью Tkinter.PhotoImage, но не видел никакого успеха. Он отображает изображение, но не анимацию. Ниже приведен мой код:

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

он отображает изображение в окне, и все. Я думаю, что проблема имеет какое-то отношение к Tkinter.Label но я не уверен. Я искал решения, но все они говорят мне использовать Pil (Python Imaging Library), и это то, что я не хочу использовать.

С ответом я создал еще один код (который все еще не работает...), вот это:

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

Спасибо за все! :)

2 ответов


вы должны сами управлять анимацией в Tk. Анимированный GIF состоит из нескольких кадров в одном файле. Tk загружает первый кадр, но вы можете указать разные кадры, передав параметр индекса при создании изображения. Например:

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

Если вы загружаете все кадры в отдельные фотоизображения, а затем используете события таймера для переключения показываемого кадра (label.configure(image=nextframe)). Задержка на таймере позволяет управлять скоростью анимации. Ничто не предоставляются дайте вам количество кадров в изображении, кроме того, что он не может создать кадр, как только вы превысите количество кадров.

посмотреть фото страница руководства Tk для официального слова.


вот простой пример без создания объекта:

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