编程语言
首页 > 编程语言> > 使用tkinter在python中播放动画GIF

使用tkinter在python中播放动画GIF

作者:互联网

我想用python3和tkinter创建一个虚拟宠物风格的游戏.到目前为止,我已经有了主窗口并且已经开始添加标签,但我遇到的问题是播放GIF动画.我在这里搜索并找到了一些答案,但他们不断抛出错误.我发现的结果是使用PhotoImage的gif的索引位置继续在一定范围内.

    # Loop through the index of the animated gif
frame2 = [PhotoImage(file='images/ball-1.gif', format = 'gif -index %i' %i) for i in range(100)]

def update(ind):

    frame = frame2[ind]
    ind += 1
    img.configure(image=frame)
    ms.after(100, update, ind)

img = Label(ms)
img.place(x=250, y=250, anchor="center")

ms.after(0, update, 0)
ms.mainloop()

当我在终端用“pyhton3 main.py”运行它时,我收到以下错误:

_tkinter.TclError: no image data for this index

我忽视或完全遗漏了什么?

以下是GitHub存储库的链接,以查看完整项目:VirtPet_Python

提前致谢!

解决方法:

该错误意味着您尝试加载100帧,但gif少于此.

tkinter中的GIF动画是出了名的坏事.我在一段时间之前编写了这段代码,你可以偷窃,但除了小GIF之外什么都会变得迟钝:

import tkinter as tk
from PIL import Image, ImageTk
from itertools import count

class ImageLabel(tk.Label):
    """a label that displays images, and plays them if they are gifs"""
    def load(self, im):
        if isinstance(im, str):
            im = Image.open(im)
        self.loc = 0
        self.frames = []

        try:
            for i in count(1):
                self.frames.append(ImageTk.PhotoImage(im.copy()))
                im.seek(i)
        except EOFError:
            pass

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

        if len(self.frames) == 1:
            self.config(image=self.frames[0])
        else:
            self.next_frame()

    def unload(self):
        self.config(image=None)
        self.frames = None

    def next_frame(self):
        if self.frames:
            self.loc += 1
            self.loc %= len(self.frames)
            self.config(image=self.frames[self.loc])
            self.after(self.delay, self.next_frame)

root = tk.Tk()
lbl = ImageLabel(root)
lbl.pack()
lbl.load('ball-1.gif')
root.mainloop()

标签:animated-gif,python,python-3-x,tkinter
来源: https://codeday.me/bug/20190917/1809543.html