В программирования есть так называемый механизм таймера, когда вы вызываете какую-то функцию через некоторый промежуток времени. Например можно написать так

from tkinter import *

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


def on_tick():
    canvas.create_oval(230, 80, 270, 120, fill="orange")


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

# просим запустить функцию on_tick через 1000 милисекнуд, то есть через 1 секунду
root.after(1000, on_tick)

root.mainloop()

если запустить программу то пройдет одна секунда и только после этого появится круг в центре:

хм, ну и зачем это?

Ну если просто использовать как отложенный вызов не очень интересно. Но намного интереснее получается если зациклить процесс, то есть сделать так чтобы функция тика запускала отложенный вызов еще раз. Вот так:

import random # подключаем генератор случайных чисел
from tkinter import *

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


def on_tick():
    # random.randint возвращает случайное число из указаного промежутка
    x_offset = random.randint(-100, 100)
    y_offset = random.randint(-80, 80)
    
    # используем случайные числа для сдвига
    canvas.create_oval(
        230 + x_offset,
        80 + y_offset,
        270 + x_offset ,
        120 + y_offset,
        fill="orange"
    )
    # повторяем вызов тика, сделаю задержку поменьше
    root.after(300, on_tick)


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

root.mainloop()

запускаем:

давайте добавим очистку канвы

def on_tick():
    canvas.delete("all")  # добавил удаление
    x_offset = random.randint(-100, 100)
    y_offset = random.randint(-80, 80)
    canvas.create_oval(
        230 + x_offset,
        80 + y_offset,
        270 + x_offset ,
        120 + y_offset,
        fill="orange"
    )
    root.after(500, on_tick)

запускаем:

Задание

Реализовать микроигру в которой надо успеть тыкнуть по кружочку. При клике на кружочек фиксировать информацию об попаданиях: