Python Tkinter отображать анимированный GIF с помощью PIL - PullRequest
4 голосов
/ 01 ноября 2011

Есть ли способ отобразить анимированный GIF в Tkinter с помощью библиотеки изображений Python?

Я думал, что Модуль ImageSequence будет способом сделать это, но я не знаюкак его использовать и если это возможно.

Первый вопрос: есть ли простой способ?Например: загрузите GIF, используя PIL и ImageSequence, и просто нарисуйте его в окне Tkinter, используя ImageTk.PhotoImage, и он будет анимирован.

Или я должен сам настроить функцию, используя метод after или что-то вроде time.sleep, чтобы перебирать кадры GIF и рисовать их в окне tkinter?

Второй вопрос: даже если мне нужно сделать функцию для циклического перемещения кадров GIF, должен ли модуль ImageSequence делать это или PIL имеет другой модуль для этого?

Я использую Python 3.1 и частный порт PIL , указанный в этой теме .

Ответы [ 2 ]

6 голосов
/ 03 ноября 2011

Группы новостей: comp.lang.python

От: "Фредрик Лунд"

Дата: понедельник, 1 мая 2006 г.

Даниэль Ногради писал:

'Исходный дистрибутив версии 1.1.4 поставляется со скриптами каталог, где вы можете найти player.py, gifmaker.py и explode.py которые все имеют дело с анимированным GIF. '

они все еще поставляются с 1.1.5 (и 1.1.6), и они должны работать.

если вам не хватает нескольких файлов из каталога скриптов, вы можете получить их здесь:

http://svn.effbot.org/public/pil/Scripts/


player.py запускается из командной строки

посмотрите, работает ли этот у вас:

from Tkinter import * 
from PIL import Image, ImageTk


class MyLabel(Label):
    def __init__(self, master, filename):
        im = Image.open(filename)
        seq =  []
        try:
            while 1:
                seq.append(im.copy())
                im.seek(len(seq)) # skip to next frame
        except EOFError:
            pass # we're done

        try:
            self.delay = im.info['duration']
        except KeyError:
            self.delay = 100

        first = seq[0].convert('RGBA')
        self.frames = [ImageTk.PhotoImage(first)]

        Label.__init__(self, master, image=self.frames[0])

        temp = seq[0]
        for image in seq[1:]:
            temp.paste(image)
            frame = temp.convert('RGBA')
            self.frames.append(ImageTk.PhotoImage(frame))

        self.idx = 0

        self.cancel = self.after(self.delay, self.play)

    def play(self):
        self.config(image=self.frames[self.idx])
        self.idx += 1
        if self.idx == len(self.frames):
            self.idx = 0
        self.cancel = self.after(self.delay, self.play)        


root = Tk()
anim = MyLabel(root, 'animated.gif')
anim.pack()

def stop_it():
    anim.after_cancel(anim.cancel)

Button(root, text='stop', command=stop_it).pack()

root.mainloop()
0 голосов
/ 24 июля 2018

Версия для простого PIL:

canvas = Image.new("RGB",(Width,Height),"white")
gif = Image.open('text.gif', 'r')
frames = []
try:
    while 1:
        frames.append(gif.copy())
        gif.seek(len(frames))
except EOFError:
    pass

for frame in frames:
     canvas.paste(frame)
     canvas.show()
...