Всех приветствую!
Есть небольшой набросок программы:
загружает gif-изображение, по кнопке [Next frame] смешивает текущий PIL.Image со следующим фреймом,
т.е. последовательно нажимая на [Next frame] видим анимацию gif.
В верхний label выводится результирующее изображение, в нижний - текущий фрейм.
Проблема в том что PIL.Image.open() ленивая операция и у меня кроме нулевого фрейма другие фреймы не загружаются.
Как исправить?
import tkinter as tk
from PIL import Image, ImageTk, ImageSequence
root = tk.Tk()
#frames = [tk.PhotoImage(file="pic.gif", format="gif -index %i" %(i)) for i in range(39)]
img = Image.open("pic.gif")
frames = [frame for frame in ImageSequence.Iterator(img)]
ind=0
combined_img=frames[ind]
combined_img_tk = ImageTk.PhotoImage(combined_img)
label1=tk.Label(root, image=combined_img_tk)
label1.image = combined_img_tk
label2=tk.Label(root, text = 'Reserved label')
def next_frame():
global ind
global label1
global label2
global frames
global combined_img
frame = frames[ind]
ind += 1
if ind>38:
ind=0
print(ind)
img2=frames[ind]
img2_tk = ImageTk.PhotoImage(img2)
label2.configure(image=img2_tk)
label2.image = img2_tk
combined_img.paste(img2, (20, 20), img2) #смещение чтобы было видно что накладывается
combined_img_tk = ImageTk.PhotoImage(combined_img)
label1.configure(image=combined_img_tk)
label1.image = combined_img_tk
root.title("Simple Gif View - 1")
root.geometry("640x700")
tk.Button(root, text="Quit", command=root.destroy).pack()
label1.pack()
label2.pack()
tk.Button(root, text="Next frame", command=next_frame).pack(side=tk.BOTTOM)
root.mainloop()
PS pic.gif открыта в редакторе и определено, что содержит 39 фреймов
Буду рад любым замечаниям и советам по исправлению, написанию и организации кода (кроме завертывания в классы - не оч. это нравится)
