Python tkinter中的GIF小故障

Python tkinter中的GIF小故障,python,tkinter,pycharm,Python,Tkinter,Pycharm,我创建了一个内置gif的GUI应用程序。然而,在工作过程中,gif开始出现故障 from tkinter import * import time import os root = Tk() frames = [] for i in range(61): frames.append(PhotoImage(file='bell.gif', format='gif -index ' + str(i))) def update(ind): try: frame =

我创建了一个内置gif的GUI应用程序。然而,在工作过程中,gif开始出现故障

from tkinter import *
import time
import os
root = Tk()

frames = []
for i in range(61):
    frames.append(PhotoImage(file='bell.gif', format='gif -index ' + str(i)))

def update(ind):
    try:
        frame = frames[ind]
    except IndexError:
        ind = 1
        frame = frames[ind]

    ind += 1

    label.configure(image=frame, bg="white")
    label.pack()
    root.after(100, update, ind)

label = Label(root, bg="white")

root.after(100, update(1))

root.mainloop()
这是原始gif:

最后会发生什么:

更新 您必须在包装和作品中加入枕头。

找到另一条路

from tkinter import *
from PIL import Image, ImageTk

class MyLabel(Label):
    def __init__(self, master, filename):
        im = Image.open(filename)
        seq =  []
        try:
            while 1:
                seq.append(im.copy())
                im.seek(len(seq)) # skip to next frame
        except EOFError:
            pass # we're done

        try:
            self.delay = im.info['duration']
        except KeyError:
            self.delay = 100

        first = seq[0].convert('RGBA')
        self.frames = [ImageTk.PhotoImage(first)]

        Label.__init__(self, master, image=self.frames[0])

        temp = seq[0]
        for image in seq[1:]:
            temp.paste(image)
            frame = temp.convert('RGBA')
            self.frames.append(ImageTk.PhotoImage(frame))

        self.idx = 0

        self.cancel = self.after(self.delay, self.play)

    def play(self):
        self.config(image=self.frames[self.idx])
        self.idx += 1
        if self.idx == len(self.frames):
            self.idx = 0
        self.cancel = self.after(self.delay, self.play)


root = Tk()
anim = MyLabel(root, 'bell.gif')
anim.pack()
root.mainloop()

您从
update
内部对
ind
所做的更改将丢失。请参阅@Mark:它们没有丢失,因为更新后的值在该函数末尾调用
root.after()
时作为参数传递。Doggy4:您的代码看起来基本正常。我认为问题与您使用的GIF图像有关,因此我建议尝试另一种。有一个叫做“小全球”,你可以从中得到。当我使用它而不是您的
bell.gif
,没有问题。问题解决了。安装枕头包如果您使用pycharm,请使用枕头包