有没有办法在Tkinter中使用Python Image Library显示动画GIF?
我认为ImageSequence module是这样做的方法,但我不知道如何使用它,如果可能的话。
第一个问题是,是否有任何简单的方法。例如:使用PIL和ImageSequence加载GIF,然后使用ImageTk.PhotoImage
在Tkinter窗口上绘制它,它将被设置为动画。
或者我是否必须自己设置一个函数,使用after
方法或类似time.sleep
的方法循环遍历GIF帧并在tkinter窗口上绘制它们?
第二个问题:即使我必须创建一个循环GIF帧的函数,ImageSequence模块应该这样做还是PIL有另一个模块呢?
我使用的是Python 3.1和private port of PIL topic。
答案 0 :(得分:6)
新闻组:comp.lang.python
来自:“Fredrik Lundh”
日期:2006年5月1日星期一
Daniel Nogradi写道:
'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()
答案 1 :(得分:0)
简单的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()