使用 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:该索引没有图像数据

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

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

提前致谢!

原文由 nmoore146 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.5k
2 个回答

该错误意味着您尝试加载 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="")
        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()

原文由 Novel 发布,翻译遵循 CC BY-SA 4.0 许可协议

首先,您需要知道 GIF 文件的最后范围是什么。所以通过改变 i 的不同值,你会得到它。因为我的条件是 31。然后只需要输入条件。所以它会无限播放 gif。

     from tkinter import *
    import time
    import os
    root = Tk()

    frames = [PhotoImage(file='./images/play.gif',format = 'gif -index %i' %(i)) for i in range(31)]

    def update(ind):
        frame = frames[ind]
        ind += 1
        print(ind)
        if ind>30: #With this condition it will play gif infinitely
            ind = 0
        label.configure(image=frame)
        root.after(100, update, ind)

    label = Label(root)
    label.pack()
    root.after(0, update, 0)
    root.mainloop()

原文由 Kushal Bhavsar 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题