У меня есть рабочий код, в котором приложение tkinter отображает неподвижное изображение из GIF и воспроизводит тот же файл GIF при нажатии кнопки. Он отлично работает для одного изображения в формате GIF.

Я хочу иметь дополнительную кнопку для следующего изображения, и когда я нажимаю на нее, она должна отображать следующее изображение и воспроизводить это изображение в формате GIF. Как я могу этого добиться? Вот мой код:

from tkinter import *
from PIL import Image
canvas_width = 300
canvas_height =300

root = Tk()

canvas = Canvas(root, 
           width=canvas_width, 
           height=canvas_height)
canvas.pack()
file="jatan.gif"
info = Image.open(file)

frames = info.n_frames  # gives total number of frames that gif contains

# creating list of PhotoImage objects for each frames
im = [PhotoImage(file=file,format=f"gif -index {i}") for i in range(frames)]
my_image = PhotoImage(file='jatan.gif')
canvas.create_image(20, 20, anchor = NW, image=my_image)
count = 0
anim = None
def animation(count):
    global anim
    im2 = im[count]
    gif_label.configure(image=im2)
    count += 1
    if count == frames:
        count = 0
    anim = root.after(50,lambda :animation(count))


gif_label = Label(root,image="")
gif_label.pack()

start = Button(root,text="start",command=lambda :animation(count))
start.pack()

root.mainloop()
0
ACSO 28 Фев 2021 в 12:09

1 ответ

Лучший ответ

Довольно легко изменить ваш код для достижения нового поведения. Вы должны изменить свою единую файловую переменную для списка файлов и индекса, который указывает на текущее отображаемое изображение, например

files = ['gif1.gif', 'gif2.gif']
current_file = 0

Затем во всех местах, где вы использовали файловую переменную, вы должны теперь использовать files[current_file], то есть:

info = Image.open(files[current_file])
...
im = [PhotoImage(file=files[current_file], format=f"gif -index {i}") for i in range(frames)]
my_image = PhotoImage(file=files[current_file])
canvas_img = canvas.create_image(20, 20, anchor = NW, image=my_image)

Теперь вам нужно создать новую кнопку, похожую на кнопку запуска, но с использованием другой функции, которую мы можем обозначить как next_gif(). Функция будет извлекать глобальные переменные, которые относятся к предварительному просмотру gif и фреймам, и обновлять их следующим изображением в списке, сначала обновляя счетчик:

def next_gif():
    global current_file
    global im

    current_file = (current_file + 1) % len(files)

    info = Image.open(files[current_file])
    frames = info.n_frames
    im = [PhotoImage(file=files[current_file], format=f"gif -index {i}") for i in range(frames)]

    my_image = PhotoImage(file=files[current_file])
    canvas.itemconfig(canvas_img, image=my_image)

С этим все будет работать. Однако вы загружаете все кадры заново каждый раз, когда просматриваете следующее изображение. Если у вас небольшое количество gif, вы можете создать список (или любую подобную структуру данных) того же размера, что и количество файлов gif, и хранить там все данные кадров, используя его как механизм, подобный кешу, загружая все из начало или выполнение отложенной загрузки ТОЛЬКО в первый раз, когда вы визуализируете это изображение.

0
JosepJoestar 28 Фев 2021 в 09:41