使用 Tkinter 播放 GIF 动画
Play Animations in GIF with Tkinter
我一直在尝试使用 Tkinter.PhotoImage
播放动画 gif,但没有看到任何成功。它显示图像,但不显示动画。以下是我的代码:
root = Tkinter.Tk()
photo = Tkinter.PhotoImage(file = "path/to/image.gif")
label = Tkinter.Label(image = photo)
label.pack()
root.mainloop()
它将图像显示在 window 中,仅此而已。我认为这个问题与 Tkinter.Label
有关,但我不确定。我一直在寻找解决方案,但他们都告诉我使用 PIL(Python 成像库),这是我不想使用的东西。
有了答案,我又写了一些代码(还是不行...),这里是:
from Tkinter import *
def run_animation():
while True:
try:
global photo
global frame
global label
photo = PhotoImage(
file = photo_path,
format = "gif - {}".format(frame)
)
label.configure(image = nextframe)
frame = frame + 1
except Exception:
frame = 1
break
root = Tk()
photo_path = "/users/zinedine/downloads/091.gif"
photo = PhotoImage(
file = photo_path,
)
label = Label(
image = photo
)
animate = Button(
root,
text = "animate",
command = run_animation
)
label.pack()
animate.pack()
root.mainloop()
谢谢你所做的一切! :)
你必须自己在Tk中驱动动画。动画 gif 由单个文件中的多个帧组成。 Tk 加载第一帧,但您可以在创建图像时通过传递索引参数来指定不同的帧。例如:
frame2 = PhotoImage(file=imagefilename, format="gif -index 2")
如果将所有帧加载到单独的 PhotoImages 中,然后使用计时器事件切换显示的帧 (label.configure(image=nextframe)
)。计时器上的延迟可让您控制动画速度。除了一旦超过帧数就无法创建帧之外,没有提供任何内容来为您提供图像中的帧数。
请参阅 photo Tk 手册页以获取官方单词。
这是一个没有创建对象的更简单的示例:
from tkinter import *
import time
import os
root = Tk()
frameCnt = 12
frames = [PhotoImage(file='mygif.gif',format = 'gif -index %i' %(i)) for i in range(frameCnt)]
def update(ind):
frame = frames[ind]
ind += 1
if ind == frameCnt:
ind = 0
label.configure(image=frame)
root.after(100, update, ind)
label = Label(root)
label.pack()
root.after(0, update, 0)
root.mainloop()
我一直在尝试使用 Tkinter.PhotoImage
播放动画 gif,但没有看到任何成功。它显示图像,但不显示动画。以下是我的代码:
root = Tkinter.Tk()
photo = Tkinter.PhotoImage(file = "path/to/image.gif")
label = Tkinter.Label(image = photo)
label.pack()
root.mainloop()
它将图像显示在 window 中,仅此而已。我认为这个问题与 Tkinter.Label
有关,但我不确定。我一直在寻找解决方案,但他们都告诉我使用 PIL(Python 成像库),这是我不想使用的东西。
有了答案,我又写了一些代码(还是不行...),这里是:
from Tkinter import *
def run_animation():
while True:
try:
global photo
global frame
global label
photo = PhotoImage(
file = photo_path,
format = "gif - {}".format(frame)
)
label.configure(image = nextframe)
frame = frame + 1
except Exception:
frame = 1
break
root = Tk()
photo_path = "/users/zinedine/downloads/091.gif"
photo = PhotoImage(
file = photo_path,
)
label = Label(
image = photo
)
animate = Button(
root,
text = "animate",
command = run_animation
)
label.pack()
animate.pack()
root.mainloop()
谢谢你所做的一切! :)
你必须自己在Tk中驱动动画。动画 gif 由单个文件中的多个帧组成。 Tk 加载第一帧,但您可以在创建图像时通过传递索引参数来指定不同的帧。例如:
frame2 = PhotoImage(file=imagefilename, format="gif -index 2")
如果将所有帧加载到单独的 PhotoImages 中,然后使用计时器事件切换显示的帧 (label.configure(image=nextframe)
)。计时器上的延迟可让您控制动画速度。除了一旦超过帧数就无法创建帧之外,没有提供任何内容来为您提供图像中的帧数。
请参阅 photo Tk 手册页以获取官方单词。
这是一个没有创建对象的更简单的示例:
from tkinter import *
import time
import os
root = Tk()
frameCnt = 12
frames = [PhotoImage(file='mygif.gif',format = 'gif -index %i' %(i)) for i in range(frameCnt)]
def update(ind):
frame = frames[ind]
ind += 1
if ind == frameCnt:
ind = 0
label.configure(image=frame)
root.after(100, update, ind)
label = Label(root)
label.pack()
root.after(0, update, 0)
root.mainloop()