我正在尝试使用 Tkinter 显示 gif,但是当 gif 加载时,它看起来很奇怪。我已经粘贴了原始 gif 和 Tkinter 中显示的 gif 的屏幕截图。这种情况不会只发生在一张 gif 中,而是发生在我使用的每一张 gif 中。
Gif 中的原始帧:
tkinter 中看到的框架:
这是代码:
from Tkinter import *
import time as t
root = Tk()
frames = []
i = 0
while True:
try:
frames.append(PhotoImage(file='display.gif',format='gif -index %i' %(i)))
i += 1
except TclError:
break
def update(ind):
if ind >= len(frames):
ind = 0
frame = frames[ind]
ind += 1
label.configure(image=frame)
root.after(100, update, ind)
label = Label(root)
label.pack()
root.after(0,update,0)
root.mainloop()
直接对 GIF 文件使用
tk.PhotoImage
会出现此问题,每一帧都依赖于前一帧,因此不起作用。
这里有两个解决方案
[1] 使用
PIL.ImageTk.PhotoImage
from PIL import Image, ImageTk
import tkinter as tk
def update():
global index, image
index = (index+1) % frames
im.seek(index)
image = ImageTk.PhotoImage(im)
label.configure(image=image)
root.after(100, update)
filename = 'Your File.gif'
im = Image.open(filename)
index, frames = 0, im.n_frames
root = tk.Tk()
im.seek(index)
image = ImageTk.PhotoImage(im)
label = tk.Label(root, image=image)
label.pack()
root.after(0, update)
root.mainloop()
[2] 使用
tk.PhotoImage
和新方法 copy
,这里从 GIF 文件加载每一帧需要更长的时间。
import tkinter as tk
def update():
global index
index = (index + 1) % indexes
label.configure(image=images[index])
root.after(100, update)
root = tk.Tk()
filename = 'cat.gif'
index = 0
image = tk.PhotoImage(file=filename, format=f'gif -index 0')
images = [image]
while True:
try:
index += 1
delta_image = tk.PhotoImage(file=filename, format=f'gif -index {index}')
image.tk.call(image, 'copy', delta_image)
images.append(image.copy())
except tk.TclError:
break
index, indexes = 0, len(images)
label = tk.Label(root, image=images[0])
label.pack()
root.after(100, update)
root.mainloop()