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_2.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')
Otázky
Kalkulačka pro výpočet čisté mzdy na "Dohodu o pracovní činnosti" (DPČ).
Mzda se vypočítává z odpracované hodiny. Hodinová sazba je 100 Kč za hodinu, což je hrubá mzda brigádníka. Daň z příjmů (co platíme státu) je 15 % a tu platíme vždy. V případě, že příjem přesáhne 4000 Kč, tak se z hrubého příjmu bude odečítat ještě zdravotní (4,5 %) a sociální pojištění (6,5 %).
Napište program 13_dpc.py, který ze zadaného počtu odpracovaných hodin vypíše hrubou a čistou mzdu. Správnost si můžete ověřit na php.edumach.cz/dpc.php.
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.
Otázky
and na operátor or?x < 150 nebo y > 150?Hrajeme hru, ve které házíme desetkrát kostkou a získáváme prémii vždy, když za sebou padnou dvě stejná čísla. Vytvořte program 13_premie.py, který simuluje deset hodů kostkou, hozená čísla vypíše a spočítá počet prémií. Tento počet prémií potom vypíše. Jestliže například budou hozena následující čísla:
4
4
6
5
3
3
3
1
5
5
program vypíše:
Počet prémií: 4
V televizní soutěži o pečení "Můj děda peče líp než tvůj" jsou následující pravidla:
Vytvořte nový program 13_kolacky.py, ve kterém přiřadíš do proměnné kolace počet upečených koláčků. Program poté rozhodne, zda je daný soutěžící začátečník, pokročilý nebo expert, a vypíše vhodnou hlášku.
Otestujte, zda program zobrazí správnou hlášku pro následující počty upečených koláčků: 1, 9, 10, 19, 20, 100.
Máme krabici ve tvaru obdélníku s délkami stran, které jsou uložené v proměnných a, b. Krabici chceme položit vždy naležato. Vytvořte program 13_krabice.py, ve kterém na začátku přiřadíte do proměnných a, b rozměry krabice. Program nakreslí krabici tak, aby vždy ležela delší stranou na zemi (příklady jsou na obrázcích níže).
Ověřte, že program funguje správně pro různé kombinace hodnot proměnných a, b.
Vytvořte nový program 13_kruhy.py, který bude kreslit nad sebe dva kruhy. Do proměnných r1, r2 přiřaďte poloměry kruhů. Napište kód programu, který nakreslí oba dva kruhy tak, aby menší kruh ležel vždy na větším podobně jako na obrázku níže.
Vytvořte program 13_barevne_koralky.py, ve kterém se pomocí jediného cyklu s vnořeným větvením nakreslí 15 korálků. Prvních 8 budou náhodně obarvené červené nebo žluté, zbylých 7 bude modře nebo zeleně. Výsledek může vypadat například jako na následujícím obrázku:
Vytvořte program 13_koralky_platno.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 10 000× 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 až 300y z rozsahu 100 až 200cas z rozsahu 0 až 16Program několikrát spusťte a sledujte, zda se krajinky vytváří dle očekávání: