testovac.sk

časovač

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é 😥.

Lepšie riešenie

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