Tkinter 显示扭曲的图像

问题描述 投票:0回答:1

我正在尝试使用 Tkinter 显示 gif,但是当 gif 加载时,它看起来很奇怪。我已经粘贴了原始 gif 和 Tkinter 中显示的 gif 的屏幕截图。这种情况不会只发生在一张 gif 中,而是发生在我使用的每一张 gif 中。

Gif 中的原始帧:

enter image description here

tkinter 中看到的框架:

enter image description here

这是代码:

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()
python tkinter gif
1个回答
0
投票

直接对 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()
© www.soinside.com 2019 - 2024. All rights reserved.