python - želví geometrie
https://vyuka.ookami.cz/materialy/python/gui/turtle/turtle.xml

- Úvod
- Základní pohyby želvy
- PS: vektor "Vec2D"
- Ovládání pera
- Vyplňování (uzavřených) obrazců barvou
- Nastavení barev I
- Nastavenáí barev 2
Všechny příkazy je třeba volat přímo na importovaném modulu turtle
Základní pohyby želvy
Želva se pohybuje po obrazovce především relativně, to znamená za pomoci následujících příkazů:
- forward(KROKŮ) - posun o KROKŮ ve směru natočení želvy;
- backward(KROKŮ) - posun o KROKŮ dozadu proti směru natočení želvy;
- left(STUPŇŮ) - otočení želvy na místě o STUPŇŮ doleva;
- right(STUPŇŮ) - otočení želvy na místě o STUPŇŮ doprava.
Ale jelikož jde o pohyb v rámci soustavy souřadné, dokáže reagovat i na klasické souřadnice:
- goto(x, y=None) - přesunutí želvy na nové souřadnice v ploše x, y;Pokud je y=None, očekává se parametr x buď jako explicitní dvojce nebo v podobě vektoru Vec2D (který vrací například funkce position()).
- setx(x) - přesunutí želvy na novou souřadnici x při zachování původní souřadnice y;
- sety(y) - přesunutí želvy na novou souřadnici y při zachování původní souřadnice x;
PS: vektor "Vec2D"
Želva podporuje zadávání (a vracení) souřadnic kromě klasické dvojce hodnot (x, y) také jako objekt typu Vec2D. Jako potomek n-tice se chová jako n-tice, ale jeho velkým přínosem je přímá podpora vektorových operací, konkrétně:

Ovládání pera
Želva při svém pohybu buď zanechává stopu ("ocásek dole") nebo naopak nezanechává ("ocásek nahoře"):
pendown() & penup()
Navíc můžete nastavit tloušťku zanechávané stopy..
pensize(ŠÍŘKA)
..a také se zeptat, v jakém stavu zrovna pero je:
isdown()
Vyplňování (uzavřených) obrazců barvou
Uzavřené obrazce je možno (po jejich dokreslení) vyplnit zvolenou barvou. K tomu slouží příkazy:
begin_fill() & end_fill()
Aktuální stav vyplňování umí vrátit příkaz:
filling()
Nastavení barev I
I. Stopa, kterou za sebou želva zanechává, může býti nejrůznější barvy:
pencolor('barva') & pencolor(r, g, b) & pencolor((r, g, b))
Bez parametrů pak vrátí aktuální nastavení.
II. Úplně stejně se ovládá barva výplně uzavřeného obrazce:
fillcolor('barva') & fillcolor(r, g, b) & fillcolor((r, g, b))
III. A nebo se dají nastavit oba údaje najednou jedním příkazem, především:
color(BarvaPera, BarvaVýplně)
Existují i další varianty volání, ale tahle dvouparametrová je asi nejužitečnější.
Nastavení barev II
Rozsahy barev pro mód (r, g, b) existují dvojí:
- reálné z intervalu (0.0, 1.0);
- celočíselné z intervalu (0, 255).
Výchozí mód je velmi pravděpodobně reálný a pokud chcete celočíselný, musíte se na něj přepnout příkazem:
turtle.colormode(255)
V opačném případě na reálný se naopak přepíná pomocí colormode(1.0).
Vypsání textu
Želva také umí na místě, kde stojí, vypsat text. Při výchozím nastavení atributu move při tom svoji pozici nezmění:
write(arg, move=False, align="left", font=("Arial", 8, "normal"))
Schování želvy
Jako výukový nástroj je želva pohybující se po obrazovce dobrá, ale pokud použijete modul turtle ke grafickému výstupu nějakého programu, asi ji tam (i když třebas v podobě šipky) chtít nebudete:
hideturtle() & showturtle()
Existuje samozřejmě i metoda, která vrátí aktuální stav viditelnosti želvy:
isvisible()
PS: Kdybyste to potřebovali (např. při kreslení grafů v reálném čase), existuje celá armáda metod ovlivňujících způsob zobrazení želvy samotné. Pro začátek se podívejte třebas na shape() nebo tilt().
Zrychlení želvy
Totéž se týká rychlosti vykreslování - vidět ze začátku nebo později během ladění skriptu, co se během kreslení děje, je fajn, ale po odladění je to převážně už jenom na škodu. Základního zrychlení se dá dosáhnout pomocí..
speed(RYCHLOST)
..ale to správné ořechové zařídí až vypnutí zobrazování většiny mezi výsledků:
tracer(NtáObrazovka, Zpoždění)update()
Pokud nastavíte tracer() na absurdně vysoký počet vynechaných snímků z hlediska vašeho obrázku, nezapomeňte "želvě" vnutit vykreslení konečné kresby pomocí update().
U hodně složitých kreseb ale stejně kreslení ani tak není moc rychlé - interně prostě pythoní "želva" moc rychlá není.
Změna soustavy souřadné
I. Okno otevřené Python'em pro "želví grafiku" se v jistých mezích přizpůsobuje velikostí dostupné ploše. Což vám asi nebude moc vyhovovat, takže to můžete zkusti změnit (přidat skrolovátka je poněkud těžší úkol):
screensize(canvwidth=None, canvheight=None, bg=None)
II. Vzhledem k předchozímu a také vzhledem k tomu, že "želva" začíná svoji cestu uprostřed obrazovky, je dobré vědět, kolik má kolem sebe místa:
window_height() & window_width()
III. Bezvadné je, že celý souřadnicový kříž můžete v rámci kreslicího okna snadno posunout (souřadnice ve funkci jdou od "lower-left" po "upper-right"):
setworldcoordinates(llx, lly, urx, ury)
Pokud nesledujete konkrétní záměr, radši nechte poměry obou os stejné.
Posun kanvasu
Veškeré kreslení se odehrává na kanvasu tkinteru a želva celkem logicky obsahuje metody pro získání přístupu k tomuto grafickému toolkitu (například pomocí metody getcanvas()). Specielně posuvný kanvas se dá zajistit odvoláním se na tento kontext třebas následujícím kódem:
#!/usr/bin/env python3 import turtleimport tkinter root = tkinter.Tk()root.geometry('500x500-5+40')cv = turtle.ScrolledCanvas(root, width=900, height=900)cv.pack() screen = turtle.TurtleScreen(cv)screen.screensize(2000,1500)t = turtle.RawTurtle(screen)t.hideturtle()t.circle(100) root.mainloop()
Převzato ze Stack Overflow.
Poziční stav želvy I
"Želva" umožňuje uložit (a pak zase nastavit) svůj stav v kreslicí ploše, to znamená pozici a směr natočení:
position() & heading()setposition(x, y=None) & setheading(ÚHEL)
Význam parametrů u setposition() je stejný jako u příkazu goto().
Existují i metody pro jednotlivé složky (jak už jsme částečně viděli u nastavení pozice):
xcor() & ycor()setx(x) & sety(y)
PS: Často tímto můžete některé rekurzivní algoritmy zbavit rekurze, ale hodí se to i na spoustu jiných věcí.
Poziční stav želvy II
Želva je dokonce schopná určit i svoji pozici vůči jiným bodům:
- distance(x, y=None) - vzdálenost od zadaného bodu;
- towards(x, y=None) - úhel mezi směrem želvy a zadaným bodem.
Význam parametrů je stejný jako u příkazu goto().
Mazání kresby
Jednotlivé želvy mohou mazat, co po sobě zanechaly, aniž by ovlivňovaly kresby vytvořené (případnými) jinými želvami. Přitom to jde zařídit dvěma způsoby:
- clear() - se zachováním aktuálního nastavení želvy;
- reset(y) - kompletní reset do počátečního stavu.
Více želv najednou
Z předchozího slajdu se dá vydedukovat, že na jeden výstup můžete kreslit vícero želvami a jejich kresby jsou navzájem nezávislé. Což je bezva ^_^

Události
Jelikož se pomocí želv dají vyrábět dosti komplexní věci, asi nepřekvapí, že želvy (resp. vykreslovací okno) dokáží reagovat na spoustu událostí. Namátkou:
- onclick(fun, btn=1, add=None)
- onrelease(fun, btn=1, add=None)
- ondrag(fun, btn=1, add=None)
- onkey(fun, key)
- onkeypress(fun, key=None)
- ontimer(fun, t=0)
- ...
Vlastnosti okna
I. Jelikož si každá kresba otevírá své vlastní okénko, je fajn je umět nějak pojmenovat:
title(ŘETĚZEC)
II. Jinak se program napsaný pomocí želvy chová jako klasické GUI, takže aby se okno na konci kresby nezavřelo, je třeba nahodit hlavní čekací smyčku:
mainloop() & exitonclick()
Za ní se interpret dostane až v okamžiku opuštění programu, tak s tím počítejte.
Ukládání výstupu
Obrázek vytvořený želvou (či želvami) je možno uložit odvoláním se na tkinterový kanvas, ve kterém se veškeré kreslení odehrává. Vzhledem ke stáří a historii tohoto grafického toolkitu je však výstupní formát jeden jediný - EPS (encapsulated postscript):
getcanvas().postscript(file='obrazek.eps')
Dokumentace
Modul turtle je veliký. Pro úplný přehled si asi budete chtít prostudovat oficiální dokumentaci.
A pro získání nadhledu se můžete podívat třebas k Brianu Harveymu ^_~