python tkinter使用PIL显示动画GIF

Mar*_*ito 4 python tkinter animated-gif python-imaging-library

有没有办法使用Python Image Library在Tkinter中显示动画GIF?

我认为ImageSequence模块是这样做的方法,但我不知道如何使用它,如果可能的话.

第一个问题是,是否有任何简单的方法.例如:使用PIL和ImageSequence加载GIF,然后使用它在Tkinter窗口上绘制它,ImageTk.PhotoImage它将被设置为动画.

或者我是否必须自己设置一个函数,使用该after方法或类似的方法time.sleep循环遍历GIF帧并在tkinter窗口上绘制它们?

第二个问题:即使我必须创建一个循环GIF帧的函数,ImageSequence模块应该这样做还是PIL有另一个模块呢?

我正在使用Python 3.1和PIL私有端口,在本主题中指出.

小智 6

新闻组:comp.lang.python

来自:"Fredrik Lundh"

日期:2006年5月1日星期一

Daniel Nogradi写道:

'1.1.4版本的源代码发布附带一个Scripts目录,你可以在其中找到所有处理动画gif的player.py,gifmaker.py和explode.py.

他们仍然带有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()
Run Code Online (Sandbox Code Playgroud)