Теорія:

У мультфільмах іллюзія руху створюється за рахунок послідовної зміни кадрів, кожний із яких фіксує черговий етап руху об’єкта.  Використовуючи цей принцип, ми можемо запрограмувати показ мультфильма на полотні canvas. 
Перш за все потрібно приготувати певну кількість графічних файлів з розширеннями .gif' або .png,  що містять зображення етапів руху деякого об’єкта. Далі програмуємо послідовне завантаження на полотно зображень з цих файлів. Між завантаженнями потрібно виконати  затримку виконання програми для того, щоб користувач встиг побачити чергове зображення.
Розглянемо кроки створення анімації з трьох кадрів «Політ метелика».
1. Приготуємо 3 графічні файли з зображеннями метелика. Імена цих файлів зберігатимуться у списку anim=['1.gif', '2.gif', '3.gif'']
 
     56.PNG

2. Підключаємо модулі time і tkinter; створюємо вікно програми розмірами 200 × 250 із заголовком «Політ метелика».
root = Tk()    # створюємо вікно програми
root.title(' Політ метелика')
root.geometry('200x250')
anim=['1.png','2.png','3.png']  # список імен файлів
canvas = Canvas(root, width=200, height=200) # створення полотна
canvas.place(x = 1, y = 1)   # відображення полотна
play()   #виклик функції play()  
root.mainloop()  # запуск головного циклу обробки подій
3. Опишемо функцію play():
def play():
    anim=['1.gif', '2.gif', '3.gif']  # список імен файлів
    canvas = Canvas(root, width=200, height=200) # створення полотна
    canvas.place(x = 1, y = 1)   # відображення полотна
    for i in range(3): 
         my_image = PhotoImage(file=anim[i]) 
         canvas.create_image(0, 0, anchor=NW, image=my_image)
         root.update()   # оновлення полотна
         time.sleep(0.1)   # пауза на 0.1 секунди
         root.after(10, play) # виклик функції play() через 10 мс
Функція play() призначена для організації зміни зображень. У циклі for почергово значення елементів списку anim (імена графічних файлів) завантажуються до змінної my_image за допомогою функції PhotoImage (file = 'шлях до файла'), після чого викликається метод create_image().

Метод time.sleep(0.1) виконує затримку зображення на 0.1 секунди. Метод root.after() приймає два аргументи: час у мілісекундах і функцію, яку слід виконати через певний час. У наведеному коді метод after() викликається для об’єкта root з аргументами: 10 мілісекунд (0.01 секунди); play, тобто через 0.01 секунди функція play() викличе сама себе, і зміна зображень почне виконуватися знову.

4. Зберігаємо файл з програмним кодом і виконуємо програму.
Джерела:
Інформатика : підруч. для 7 кл. закл. загал. серед. освіти / [О. О. Бондаренко, В. В. Ластовецький, О. П. Пилипчук, Є. А. Шестопалов]. — Харків : Вид-во «Ранок», 2020