Program níže vykreslí 20 náhodných čtverců na náhodných pozicích:
# 13_1.py
import tkinter
import random
canvas = tkinter.Canvas(width=400, height=400)
canvas.pack()
def nahodny_ctverec():
x = random.randrange(300)
y = random.randrange(300)
a = random.randint(20, 80)
canvas.create_rectangle(x, y, x+a, y+a)
for i in range(1, 21):
nahodny_ctverec()
canvas.update()
canvas.after(500)
Předpokládejme, že chceme program upravit tak, aby kreslil větší čtverce červeně a menší modře. V takových situacích musíme do programu zapsat podmínku. Určité příkazy se provedou pouze tehdy, když je podmínka splněna, a naopak určité příkazy se provedou, když podmínka splněna není. Například: zadali bychom, že čtverce větší než 50 pixelů budou červené a menší čtverce modré.
Náš podmíněný příkaz by mohl znít: "pokud je velikost větší než 50, vykresli červený čtverec, v opačném případě vykresli modrý čtverec". Zapíšeme to takto:
if a > 50:
canvas.create_rectangle(x, y, x+a, y+a, fill='red')
else:
canvas.create_rectangle(x, y, x+a, y+a, fill='blue')
# 13_1.py
import tkinter
import random
canvas = tkinter.Canvas(width=400, height=400)
canvas.pack()
def nahodny_ctverec():
x = random.randrange(300)
y = random.randrange(300)
a = random.randint(20,80)
if a > 50:
canvas.create_rectangle(x, y, x+a, y+a, fill='red')
else:
canvas.create_rectangle(x, y, x+a, y+a, fill='blue')
for i in range(1,21):
nahodny_ctverec()
canvas.update()
canvas.after(500)
Všimněte si, že za příkazem if a podmínkou následuje dvojtečka (stejně jako v cyklu for nebo po definici funkce). Dvojtečka následuje také za příkazem else, za který zapisujeme příkazy, které se mají provést, pokud podmínka není splněna. Důležité je také odsazení příkazů v zápise větvení. Všechny odsazené příkazy spadají pod větev if, resp. else. Pokud bychom některé řádky neodsadili, program by je provedl, jako by nebyly v příkazech if nebo else, nebo by ohlásil chybu odsazení.
Místo a > 50 mohou být jiné podmínky (podle toho, co chceme, aby bylo splněno). Můžeme použít i takové zápisy:
| Příklad | Význam |
|---|---|
a < 50 |
podmínka je splněna, pokud a je menší než 50 |
a <= 50 |
podmínka je splněna, pokud a je menší nebo rovno 50 |
a >= 50 |
podmínka je splněna, pokud a je větší nebo rovno 50 |
a == 50 |
podmínka je splněna, pokud a je rovno 50 |
a != 50 |
podmínka je splněna, pokud a není rovno 50 |
50 < a < 60 |
podmínka je splněna, pokud a je mezi 50 a 60 (s výjimkou 50 a 60) |
50 <= a <= 60 |
podmínka je splněna, pokud a je mezi 50 a 60 (včetně 50 a 60) |
Upravme funkci nahodny_ctverec() následujícím způsobem:
def nahodny_ctverec():
x = random.randrange(300)
y = random.randrange(300)
a = random.randint(20,80)
if 40 < a < 60:
canvas.create_rectangle(x, y, x+a, y+a, fill='red')
canvas.create_text(x+10, y+10, text=a, fill="white")
else:
canvas.create_rectangle(x, y, x+a, y+a, fill='blue')
Vytvořte program, ve kterém je nejprve nakreslena čára ve středu obrazovky. Pokud klikneme myší nad tuto čáru, program nakreslí modrý čtverec; pokud klikneme pod tuto čáru, program nakreslí žluté kolečko.
V předchozí úloze zkuste vynechat zápis s celou částí else: a příkazy ve větvi else. Bude toto neúplné if také fungovat?
V podmíněném příkazu můžeme také zadat více podmínek a spojit je pomocí logických operátorů and a or. Chceme-li, aby všechny podmínky byly splněny současně, použijeme operátor and. Operátor or použijeme tehdy, když stačí splnit alespoň jednu z podmínek.
# 13_3.py
import tkinter
import random
canvas = tkinter.Canvas(width=400, height=400)
canvas.pack()
def krouzek(souradnice):
x = souradnice.x
y = souradnice.y
if 100 < x < 150 and 50 < y < 100:
canvas.create_oval(x-5, y-5, x+5, y+5, fill='green')
else:
canvas.create_oval(x-5, y-5, x+5, y+5, fill='yellow')
canvas.bind('<Button-1>', krouzek)
Program vykreslí zelené kroužky pouze tehdy, pokud je x v rozmezí 100 až 150 a zároveň y v rozmezí 50 až 100. Pokud na plátno mnohokrát klikneme, uvidíme, kde jsou nakresleny zelené a žluté kroužky.
and na operátor `or!?x < 150 nebo y > 150?Vytvořte program 13_koralky.py, ve kterém pomocí jediného cyklu s vnořeným větvením nakreslí 15 korálků jako na obrázku. Prvních 8 korálků bude červených a zbylých 7 modrých.
Upravte předchozí program tak, aby se prvních 8 korálků barvilo náhodně pomocí
random.choice(["red", "yellow"])
a zbylých 7 pomocí
random.choice(["blue", "green"])
Výsledek může vypadat například jako na následujícím obrázku:
Vytvořte program 13_koralky_3.pya v něm nadefinujte funkci koralek. V této funkci vygenerujte náhodné pozice x, y pro střed korálku. Program potom podle x-ové souřadnice nakreslí červený nebo žlutý korálek, pokud je x < 200, modrý nebo zelený korálek pro ostatní čísla.
Využijte kreslení korálků z předchozí úlohy. Když zavoláte funkci koralek v cyklu 100×, můžete dostat například takovýto obrázek:
Vytvořte program 13_pi.py, který bude generovat náhodně rozmístěné tečky v ploše 200×200 (náhodné souřadnice nechť jsou od 1 do 200). Tečky vytvořte jako malé barevné kroužky s poloměrem 2 a vygenerujte jich 10000. Červené tečky budou ty, pro které platí x2+y2 <= 2002, ostatní budou modré. Program vypočítá podíl počtu červených teček vzhledem k počtu všech teček. Tento podíl vynásobí 4 a výsledek na závěr vypíše do okna shellu. Matematici by uměli dokázat, že tento podíl se blíží číslu Pi. Zkontrolujte, zda tomu tak skutečně je.
TIP: Zkuste i jiný čtverec než 200 × 200 nebo jiný počet teček. Jaké bude Pi?
Vytvořte program 13_nemecko.py, který na plátno nakreslí německou vlajku. Tu budete vytvářet tak, že pomocí cyklu vygenerujete 10000× náhodné souřadnice x,y. Souřadnice x bude z intervalu od 10 do 350 a souřadnice y bude z intervalu od 10 do 250. Na tyto souřadnice x,y nakreslíte barevný kroužek s poloměrem 5. Barvu kroužku zvolíte podle y-ové souřadnice následovně: když je y < 90, nakreslí se černý kroužek, když je y < 170, nakreslí se červený kroužek, jinak se nakreslí žlutý kroužek. Výsledek by měl vypadat podobně jako na obrázku:
Vyzkoušejte, jak bude výsledek vypadat, jestliže se bude generovat menší počet barevných kroužků (například 100 nebo 1000).
Vytvořte program 13_cr.py, který podobnou technikou, jako byla použita v předchozí úloze, nakreslí českou vlajku. Obrázek může vypadat například takto:
Modrý klín se kreslí na dvou místech:
y < 130) musí platit x < y, tedy modré kroužky jsou pod úhlopříčkou.y < 130, neboli platí y >= 130) musí být modré kroužky nad otočenou uhlopříčkou 130 − x > y − 130.Vytvořte program 13_den_noc.py, který podle zadaného času v hodinách nakreslí do grafické plochy slunce nebo měsíc. Do proměnné cas přiřaďte počet hodin. Použijte příkaz větvení na to, aby se pro cas < 8 kreslil měsíc jako bílý kruh, jinak se kreslilo slunce jako žlutý kruh. Poloměr kruhu nechť je v obou případech 50 a střed kruhu má souřadnice 200, 100. Program by měl například nakreslit:
Do předchozího řešení doplňte kreslení pozadí -- měsíc se nakreslí na tmavomodré pozadí, slunce na světlemodré pozadí:
Stačí, když do každé větve přidáte příkaz na kreslení velkého obdélníku, který překryje celou grafickou plochu:
if ...... :
canvas.create_rectangle(......, fill='navy')
canvas.create_oval(......, fill='white')
else:
canvas.create_rectangle(......, fill='cyan')
canvas.create_oval(......, fill='yellow')
Upravte předchozí program tak, aby se nejdříve do proměnných x, y přiřadily souřadnice středu kruhu a ty se potom použily v příkazech create_oval. Kromě toho přidejte na úplný konec programu i kreslení zeleného obdélníku, který bude představovat krajinu. Potom program pro x = 200 a y = 150 bude kreslit scény jako na následujících obrázcích:
Horní okraj zeleného obdélníku umístěte na y-ovou souřadnici 180.
Vylepšete předchozí program tak, aby fungoval jako náhodný generátor krajinek – přiřaďte na začátku do proměnných x, y, cas náhodná čísla:
x z rozsahu 100, 300y z rozsahu 100, 200cas z rozsahu 0, 16Program několikrát spusťte a sledujte, zda se krajinky vytváří dle očekávání: