Таймер вообще невероятно классная штука. С помощью него можно добиться динамики в программе. Например можно сделать примерно следующим образом базовую структуру типовой игры.

from tkinter import *

root = Tk()
root.title("Я приложение =)")

# данные описывающие состояние игры
data = {
    "counter": 0,
}


# тут обновляем положение объектов
def update():
    pass


# тут рисуем объекты
def draw_all():
    pass


# это обработчик одной итерации
def on_tick():
    update() # обновляем положение объектов на канве

    canvas.delete("all")  # очищаем канву
    draw_all()  # рисуем объекты
    
    data['counter'] += 1  # увеличиваем счетчик итераций
    root.after(33, on_tick)  # перезапускаем счетчик


canvas = Canvas(root, width=500, height=200, bg="white")
canvas.pack()
on_tick()

root.mainloop()

использую такю структуру очень удобно писать даже очень сложную логику.

Допустим я хочу реализовать следование кружочка за мышью. Добавим положение мыши в данные:

data = {
    "counter": 0,
    "mouse": (0, 0),  # по умолчанию считаем что мышь имеет координату 0, 0
}


def update():
    pass


def draw_all():
    x, y = data['mouse']
    # рисуем кружок
    canvas.create_oval(
        x - 10,
        y - 10,
        x + 10,
        y + 10,
        fill="orange"
    )

запускаем:

вон он там в левом верхнем углу.

Теперь давайте попробуем поймать событие движения мыши и в этом событии будем менять координаты кружка:

попробуем запустить:

прикольно да!) Теперь попробуйте задание сделать =)

Задание

Реализуйте логику как на гифке