Ak chceme aby sa v canvas vykonával nejaký pohyb "automaticky", môžeme to spraviť takto:
while True:
x = random.randint(10, 370)
y = random.randint(10, 250)
canvas.create_oval(x - 10, y - 10, x + 10, y + 10, fill='red')
canvas.update()
canvas.after(100)
Problémom tohoto riešenia je, že ak umiestnime nejaké príkazy pod nekonečný cyklus, tie sa nikdy nevykonajú. Ak teda raz spustíme cyklus, už nevieme urobiť nič iné 😥.
Použijeme dvojparametrovú verziu príkazu after:
canvas.after(milisekundy, funkcia)
Táto funkcia nám umožňuje naplánovať spustenie podprogramu o niekoľko milisekúnd. Výhodou je, že vykonanie tohoto príkazu vykonávanie programu neblokuje. Pomocou príkazu vieme "simulovať" nekonečný cyklus, robíme to takto:
def casovac():
# príkazy
canvas.after(cas, casovac)
Alebo väčší program:
import tkinter
import random
def kresli():
x = random.randint(10, 370)
y = random.randint(10, 250)
canvas.create_oval(x - 10, y - 10, x + 10, y + 10, fill='red')
#canvas.update() # v časovači by sa nemalo volať
canvas.after(100, kresli)
canvas = tkinter.Canvas()
canvas.pack()
kresli() # naštartovanie časovača
print('hotovo')
tkinter.mainloop()