How to make a background in the form of a gif in tkinter? So that the animation and all other widgets are visible

from tkinter import *
from PIL import ImageTk,Image

root=Tk()



canvas=Canvas(root,width=300,height=160)



image=ImageTk.PhotoImage(Image.open("Ricardo.gif"))

canvas.create_image(0,0,anchor=NW,image=image)
canvas.pack()
root.mainloop()
Author: PolkovnikLetov, 2020-04-24

1 answers

Here I made a class for the animated Label and inserted it into Canvas using create_window

from tkinter import *
from PIL import Image, ImageTk

class AnimateGifLabel(Label):
    def __init__(self, *argv, image = None,  **kwargs):
        self.master = argv[0]
        self.filename = image
        self.check_cadrs()
        self.i = 0
        self.img = Image.open(image)
        self.img.seek(0)
        self.image = ImageTk.PhotoImage(self.img)
        super().__init__(*argv, image = self.image, **kwargs)
        if 'delay' in kwargs:
            self.delay = kwargs['delay']
        else:
            try:
                self.delay = self.img.info['duration']
            except:
                self.delay = 100
        #self.delay = 3 # Это минимально возможная задержка - иначе ткинтер не успевает обновится и не обновляет 2  (Но реагирует на события типа изменнения размера ) а при 1 даже не появляется
        self.after(self.delay, self.show_new_cadr)


    def check_cadrs(self):
        self.cadrs = Image.open(self.filename).n_frames
    def show_new_cadr(self):
        if self.i == self.cadrs:
            self.i=0
        self.img.seek(self.i)
        self.image = ImageTk.PhotoImage(self.img)
        self.config(image = self.image)
        self.i+=1
        self.master.after(self.delay, self.show_new_cadr)
root=Tk()



canvas=Canvas(root,width=300,height=160)



image=AnimateGifLabel(image = 'Ricardo.gif')

canvas.create_window(0,0,anchor=NW,window=image)
canvas.pack()
root.mainloop()
 1
Author: FotonPC, 2021-01-14 17:39:45