使用tkinter在python中播放动画GIF [英] Play an Animated GIF in python with tkinter
问题描述
我想使用python3和tkinter创建一个虚拟的宠物风格游戏.到目前为止,我已经有了主窗口并开始放入标签,但是我遇到的问题是播放动画gif.我在这里搜索并找到了一些答案,但是他们不断抛出错误.我发现使用PhotoImage的结果具有gif的索引位置,并在一定范围内继续.
I am wanting to create a virtual pet style game using python3 and tkinter. So far I have the main window and have started putting labels in, but the issue I am having is playing an animated gif. I have searched on here and have found some answers, but they keep throwing errors. The result I found has the index position of the gif using PhotoImage continue through a certain range.
# 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"运行此命令时,出现以下错误:
When I run this in terminal with "pyhton3 main.py" I get the following error:
_tkinter.TclError:该索引没有图像数据
_tkinter.TclError: no image data for this index
我俯视什么或完全忽略了什么?
What am I overlooking or completely leaving out?
这是到GitHub存储库的链接,以查看完整的项目: VirtPet_Python
Here is the link to the GitHub repository to see the full project:VirtPet_Python
提前谢谢!
推荐答案
该错误表示您尝试加载100帧,但是gif小于该帧.
The error means that you tried to load 100 frames, but the gif has less than that.
众所周知,tkinter中的gif动画效果很差.我很早以前就编写了这段代码,您可以从中窃取代码,但是除了小gif以外,其他任何东西都不会让您满意:
Animated gifs in tkinter are notoriously bad. I wrote this code an age ago that you can steal from, but will get laggy with anything but small gifs:
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()
这篇关于使用tkinter在python中播放动画GIF的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!