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()
1
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