Modul tkinter je súčasťou Pythonu a umožňuje vytvárať programy s oknami: kresliť na plátno, reagovať na klikanie myšou a klávesy, robiť animácie a používať tlačidlá či textové polia. Grafické úlohy patria k typickým úlohám praktickej maturity z informatiky. Na Mente beží tkinter v simulácii priamo v prehliadači; obrázky okien v týchto poznámkach vznikli spustením ukážok v tej istej simulácii.
Čo sa naučíš
- vytvoriť okno s plátnom a rozumieť súradniciam plátna,
- kresliť čiary, obdĺžniky, elipsy, mnohouholníky, oblúky a text,
- meniť nakreslené objekty (presun, farba, zmazanie),
- reagovať na kliknutie myšou a stlačenie klávesu,
- animovať pomocou
after, - používať tlačidlo (
Button), textové pole (Entry) a nápis (Label).
1Okno a plátno
Každý program s grafikou má rovnakú kostru:
Prázdne okno s plátnom:
tkinter.Tk()vytvorí okno.tkinter.Canvas(...)vytvorí plátno (canvas) zadanej šírky a výšky,bgje farba pozadia.pack()plátno do okna umiestni – bez neho by sa nezobrazilo.mainloop()spustí čakanie na udalosti (kliky, klávesy, časovače). Bez neho by sa okno v bežnom Pythone hneď zavrelo. Patrí na koniec programu.
Často sa používa aj skrátený zápis bez premennej okno: platno = tkinter.Canvas(width=300, height=120) a na konci platno.mainloop() – okno sa vtedy vytvorí automaticky.
1.1Súradnice
Poloha na plátne sa zadáva súradnicami x a y v pixeloch. Počiatok (0, 0) je v ľavom hornom rohu; x rastie doprava a y rastie nadol – opačne ako v matematike.
Bod (150, 75) je teda 150 pixelov od ľavého okraja a 75 pixelov od horného okraja. Stred plátna šírky w a výšky h má súradnice (w / 2, h / 2).
2Kreslenie
Kresliace metódy plátna sa začínajú create_. Ich prvé argumenty sú súradnice, za nimi nasledujú pomenované nastavenia (farba, hrúbka…).
| Metóda | Čo nakreslí | Súradnice |
|---|---|---|
create_line(x1, y1, x2, y2, …) | úsečku alebo lomenú čiaru | body, ktorými čiara prechádza |
create_rectangle(x1, y1, x2, y2) | obdĺžnik | dva protiľahlé rohy |
create_oval(x1, y1, x2, y2) | elipsu (kruh) vpísanú do obdĺžnika | rohy opísaného obdĺžnika |
create_polygon(x1, y1, x2, y2, …) | mnohouholník | vrcholy |
create_arc(x1, y1, x2, y2, start=…, extent=…) | výsek / oblúk elipsy | ako pri create_oval |
create_text(x, y, text=…) | text | bod, ku ktorému sa text ukotví |
| Nastavenie | Význam | Príklad |
|---|---|---|
fill | farba výplne (pri čiare a texte farba čiary/písma) | fill="red", fill="#ff8800" |
outline | farba obrysu (obdĺžnik, elipsa, mnohouholník, oblúk) | outline="black", outline="" (bez obrysu) |
width | hrúbka čiary alebo obrysu | width=3 |
font | písmo textu: (meno, veľkosť, štýl) | font=("Arial", 16, "bold") |
anchor | ktorá časť textu je v zadanom bode | anchor="nw" – ľavý horný roh |
Farby sa zadávajú anglickým menom ("red", "gold", "lightblue", "darkgreen"…) alebo kódom "#RRGGBB" – červená, zelená a modrá zložka v šestnástkovej sústave ("#ff0000" je červená, "#808080" sivá).
2.1Semafor
Okno programu:
Kruh nakreslíme ako elipsu vpísanú do štvorca: kruh so stredom (sx, sy) a polomerom r je create_oval(sx - r, sy - r, sx + r, sy + r). Tento vzťah sa v úlohách používa neustále.
2.2Mnohouholník a text
Okno programu:
create_polygon dostane súradnice všetkých vrcholov za sebou a posledný vrchol sám spojí s prvým. Predvolená výplň mnohouholníka je čierna, preto fill zadávame vždy.
2.3Kreslenie v cykle
Sila programovania sa ukáže, keď kreslíme cyklom. Terč – sústredné kruhy so spoločným stredom a zmenšujúcim sa polomerom:
Okno programu:
Šachovnica – dva vnorené cykly cez riadky a stĺpce; farba políčka závisí od toho, či je súčet riadku a stĺpca párny:
Okno programu:
2.4Oblúky: koláčový graf
create_arc kreslí časť elipsy. Uhol start sa meria v stupňoch od smeru „na tri hodiny“ proti smeru hodinových ručičiek, extent je veľkosť výseku v stupňoch. Výseky koláčového grafu teda začínajú tam, kde predchádzajúci skončil:
Okno programu:
2.5Náhodné kreslenie
S modulom random sa dajú kresliť náhodné obrázky – napríklad hviezdna obloha z bodiek s náhodnou polohou a veľkosťou:
Okno programu:
Náhodnú farbu zo zoznamu vyberie random.choice(["red", "blue", "green"]). Úplne náhodnú farbu vytvoríš z troch náhodných zložiek: f"#{random.randint(0, 255):02x}{random.randint(0, 255):02x}{random.randint(0, 255):02x}" (formát 02x zapíše číslo dvoma šestnástkovými ciframi).
3Práca s nakreslenými objektmi
Každá metóda create_… vráti číslo objektu (id). Pomocou neho môžeme objekt neskôr zmeniť:
| Metóda | Čo urobí |
|---|---|
platno.move(id, dx, dy) | posunie objekt o dx doprava a dy nadol |
platno.coords(id, x1, y1, x2, y2) | nastaví nové súradnice; platno.coords(id) ich vráti |
platno.itemconfig(id, fill="red") | zmení nastavenia (farbu, text, hrúbku…) |
platno.delete(id) | zmaže objekt; platno.delete("all") zmaže všetko |
Okno programu:
Výstup v konzole:
nové súradnice lopty: [200.0, 60.0, 240.0, 100.0]4Udalosti: myš a klávesnica
Grafický program väčšinu času čaká na udalosť – kliknutie, stlačenie klávesu. Na udalosť zareaguje funkcia, ktorú si k udalosti „priviažeme“ metódou bind. Takejto funkcii sa hovorí obsluha udalosti; Python ju zavolá a ako argument jej odovzdá objekt event s informáciami o udalosti.
4.1Kliknutie myšou
Okno programu:
"<Button-1>"je kliknutie ľavým tlačidlom ("<Button-3>"pravým).event.xaevent.ysú súradnice miesta kliknutia na plátne.- Pri
bindpíšeme meno funkcie bez zátvoriek – funkciu nevoláme my, zavolá ju tkinter pri každom kliknutí. - Obsluha udalosti musí mať parameter
event, aj keď ho nepoužije. - Počítadlo
pocetje globálna premenná, ktorú funkcia mení – pretoglobal pocet. (V jednoduchých grafických programoch je to bežné riešenie.)
Ďalšie udalosti myši: "<B1-Motion>" – ťahanie so stlačeným tlačidlom (hodí sa na kreslenie „perom“), "<ButtonRelease-1>" – pustenie tlačidla, "<Double-Button-1>" – dvojklik.
4.2Klávesy
Klávesy zachytávame pomocou bind_all (udalosť príde bez ohľadu na to, ktorá časť okna je aktívna). Šípky majú mená "<Left>", "<Right>", "<Up>", "<Down>"; ľubovoľný kláves zachytí "<Key>" a jeho meno je v event.keysym:
Okno programu:
(Obrázok ukazuje stav po stlačení klávesov →, →, →, ↓, ↓ a a.)
5Animácia: after
Animácia je séria malých zmien v krátkych časových odstupoch. V tkinteri na to slúži metóda after(ms, funkcia): naplánuje zavolanie funkcie o zadaný počet milisekúnd. Animačná funkcia urobí jeden krok a na konci si naplánuje sama seba znova – vznikne „cyklus“, ktorý však okno nezablokuje:
Okno programu po 1,5 s:
Loptička sa každých 30 ms posunie o (dx, dy). Keď narazí na okraj, zmení sa znamienko príslušnej rýchlosti – odrazí sa. Obrázok ukazuje stav po 1,5 sekunde.
5.1Zmena farby v čase
Časovač nemusí iba posúvať – môže meniť ľubovoľnú vlastnosť. Blikajúci nápis:
Okno programu po 1,2 s:
Zvyšok po delení (% len(farby)) zabezpečí, že sa index točí dookola: 0, 1, 0, 1…
6Tlačidlá, textové polia a nápisy
Okrem plátna má tkinter aj ďalšie prvky okna (widgety). Najpoužívanejšie:
| Prvok | Vytvorenie | Dôležité |
|---|---|---|
| tlačidlo | tkinter.Button(okno, text="OK", command=funkcia) | command – funkcia (bez zátvoriek a bez parametra) |
| textové pole | pole = tkinter.Entry(okno) | pole.get() vráti napísaný text (reťazec) |
| nápis | napis = tkinter.Label(okno, text="…") | napis.config(text="nový text") |
Každý prvok treba umiestniť – pack() ich ukladá pod seba v poradí, v akom sa zavolá.
Okno programu:
(Obrázok: do poľa sa napísalo „Ema“ a stlačilo sa tlačidlo Pozdrav.)
Text z Entry je vždy reťazec – ak s ním chceš počítať, preveď ho (int(pole.get())) a ošetri neplatný vstup (try – except, téma Výnimky).
6.1Tlačidlá a plátno spolu
Okno programu:
command musí byť funkcia bez parametrov. Ak potrebujeme zavolať funkciu s argumentom, obalíme volanie do lambda: zmen(1) – to je krátka funkcia bez parametrov, ktorá pri stlačení tlačidla zavolá zmen(1).
7Časté chyby
- Chýbajúce
pack()– plátno alebo tlačidlo sa nezobrazí. - Chýbajúce
mainloop()– v bežnom Pythone sa okno hneď zavrie (alebo sa vôbec neukáže). - Os y smeruje nadol – „vyššie“ na obrazovke znamená menšie
y. command=funkcia()namiestocommand=funkcia– so zátvorkami sa funkcia zavolá hneď pri vytváraní tlačidla, nie pri stlačení.- Obsluha udalosti bez parametra:
def klik():pribindskončí chybou – musí byťdef klik(event):. - Zabudnuté
global– funkcia, ktorá mení globálnu premennú (počítadlo, rýchlosť), potrebujeglobal meno. - Animácia cez
whileasleep– okno zamrzne; použiafter. - Text z
Entryje reťazec – na počítanie ho preveď na číslo.
Zhrnutie
- Kostra:
import tkinter,Canvas(width=…, height=…),pack(), kreslenie,mainloop(). - Súradnice:
(0, 0)vľavo hore,xdoprava,ynadol; kruh:create_oval(sx - r, sy - r, sx + r, sy + r). create_line,create_rectangle,create_oval,create_polygon,create_arc,create_text; nastaveniafill,outline,width,font,anchor.create_…vráti id;move,coords,itemconfig,deleteobjekt menia.- Udalosti:
platno.bind("<Button-1>", f),platno.bind_all("<Left>", f);def f(event):aevent.x,event.y,event.keysym. - Animácia: funkcia urobí krok a zavolá
platno.after(ms, funkcia). Button(…, command=f),Entry+get(),Label+config(text=…).
Úlohy na precvičenie
- Nakresli slovenskú vlajku bez znaku: tri vodorovné pruhy (biely, modrý, červený).
- Nakresli rad 10 kruhov rovnakej veľkosti, ktorých farba sa strieda medzi červenou a modrou.
- Po každom kliknutí nakresli na mieste kliknutia náhodne veľký kruh náhodnej farby.
- Naprogramuj štvorec, ktorý sa pohybuje zľava doprava, a keď zmizne vpravo, objaví sa opäť vľavo.
- Vytvor okno s textovým poľom a tlačidlom: po stlačení tlačidla nakresli na plátno toľko štvorcov vedľa seba, koľko je zadané v poli.
- Pomocou
"<B1-Motion>"naprogramuj jednoduché kreslenie: pri ťahaní myšou sa kreslia malé bodky.