【发布时间】:2018-06-18 06:57:08
【问题描述】:
我正在编写一个简单的小部件来使用 PILL 在 tkinter 中为 gif 设置动画,因为 tkinter 本身并不支持它们。我遇到的问题是一些 gif 正在闪烁。下面是这个效果的例子。
我正在尝试为这个 gif 制作动画:
此 gif 来源可以找到 here。
但是,当我运行我的代码时,动画变成了这样:
我把 gif 分割开,其他每一帧都是这样的:
经过一些研究,我相信这是一种压缩 gif 文件的方法,因此某些帧仅代表运动。然而,我不是 100% 的,我可能错了。如果是这种情况,我该如何改造图像以重新创建原始 gif 的质量?
我已经能够创建一个简单的解决方法,它只是跳过每隔一帧,但这并不能解决实际问题,而且很可能不适用于这样的每个 gif。
如何显示帧,使动画重新创建 gif 的原始质量。
实施:
import tkinter as tk
from PIL import Image, ImageTk, ImageSequence
class AnimatedGif:
def __init__(self, root, src=''):
self.root = root
# Load Frames
self.image = Image.open(src)
self.frames = []
self.duration = []
for frame in ImageSequence.Iterator(self.image):
self.duration.append(frame.info['duration'])
self.frames.append(ImageTk.PhotoImage(frame))
self.counter = 0
self.image = self.frames[self.counter]
# Create Label
self.label = tk.Label(self.root, image=self.image)
self.label.pack()
# Start Animation
self.__step_frame()
def __step_frame(self):
# Update Frame
self.label.config(image=self.frames[self.counter])
self.image = self.frames[self.counter]
# Loop Counter
self.counter += 1
if self.counter >= len(self.frames):
self.counter = 0
# Queue Frame Update
self.root.after(self.duration[self.counter], lambda: self.__step_frame())
def pack(self, **kwargs):
self.label.pack(**kwargs)
def grid(self, **kwargs):
self.label.grid(**kwargs)
if __name__ in '__main__':
root = tk.Tk()
gif = AnimatedGif(root, '144.gif')
gif.pack()
root.mainloop()
【问题讨论】:
标签: tkinter python-imaging-library animated-gif