python tkinter display animated GIF using PIL

前端 未结 2 1586
遇见更好的自我
遇见更好的自我 2020-12-18 08:37

Is there any way to display an animated GIF in Tkinter using Python Image Library?

I thought the ImageSequence module would be the way to do it, but I don\'t know h

相关标签:
2条回答
  • 2020-12-18 09:14

    Newsgroups: comp.lang.python

    From: "Fredrik Lundh"

    Date: Mon, 1 May 2006

    Daniel Nogradi wrote:

    'The source distribution of the 1.1.4 version comes with a Scripts directory where you can find player.py, gifmaker.py and explode.py which all deal with animated gif.'

    they're still shipped with 1.1.5 (and 1.1.6), and they should work.

    if all you're missing is a few files from the script directory, you can get them here:

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


    player.py is run from the command line

    see if this one works for you:

    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 讨论(0)
  • 2020-12-18 09:14

    Simple PIL version:

    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()
    
    0 讨论(0)
提交回复
热议问题