Každý Tkinter program začína importmi a vytvorením základného okna s plátnom (Canvas).
Skratka as tk šetrí písanie – všade potom píšeš tk. namiesto tkinter..
python
importtkinterastkimportrandomasrd# Ak potrebuješ náhodné čísla alebo miešanie (shuffle)SIRKA = 800VYSKA = 600root = tk.Tk()
root.title("Môj program") # Nadpis okna (voliteľné)canvas = tk.Canvas(root, width=SIRKA, height=VYSKA, background="white")
canvas.pack()
# ... Sem ide tvoj kód ...root.mainloop()
💡
Konštanty SIRKA a VYSKA definuj vždy hore – budú sa ti hodiť pri výpočte stredu okna (SIRKA // 2), hraniciach pohybu, veľkosti mriežky atď.
2
Kreslenie na plátno (Canvas)
Plátno (canvas) je záchytný bod pre tvoje tvary. Súradnice: X rastie doprava, Y rastie nadol.
Obdĺžnik – create_rectangle
Vyžaduje 4 body: (x1, y1, x2, y2) – ľavý horný a pravý dolný roh.
python
canvas.create_rectangle(50, 50, 150, 100, fill="red", outline="black", width=2, tags="tvar")
# fill = farba výplne# outline = farba obrysu# width = hrúbka obrysovej čiary# tags = menovka pre skupinové mazanie
Kruh / Elipsa – create_oval
Zadáva sa rovnako ako obdĺžnik, do ktorého by si túto elipsu vpísal.
python
canvas.create_oval(50, 50, 150, 150, fill="blue")
Čiara – create_line
Spájaj ľubovoľný počet bodov. Viac ako 2 body = lámané čiary.
python
# Jednoduchá priamka (napr. os)canvas.create_line(0, 100, 800, 100, fill="red", width=3)
# Viac bodov = lámaná čiara (napr. zubatá línia)canvas.create_line(100, 200, 150, 150, 200, 200, 250, 150, fill="black", width=2, tags="ciara")
Mnohouholník – create_polygon
Uzatvorený tvar zo série bodov. Ideálny pre nepravidelné tvary (napr. šípky).
python
# Nepravidelný mnohouholníkcanvas.create_polygon(
x-20, y, x+20, y, x+10, y+8, x-10, y+8,
fill="black", outline="white", tags="tvar"
)
Text na plátne – create_text
Vyžaduje len jeden bod (stred textu) X a Y. Defaultne sa text vycentruje!
python
# POZOR NA ANCHOR! Ak chceš aby sa text roztiahol doprava, použi anchor="w" (West)canvas.create_text(100, 100, text="Ahoj", fill="black", font=("Arial", 20), anchor="w")
⚠️
Anchor: Ak nešpecifikuješ anchor, text sa centruje na daný bod. Použi anchor="w" aby sa roztiahol doprava od bodu.
Mazanie objektov – delete
Mazanie je ideálne buď kompletne na všetko, alebo pomocou „tagov", alebo podľa konkrétneho ID.
python
canvas.delete("all") # Zmaže úplne všetkocanvas.delete("tvar") # Zmaže len objekty s tags="tvar"canvas.delete(id_objektu) # Zmaže konkrétny objekt podľa jeho ID
3
Vstupy od používateľa
Widgety Entry, Button a Label pre zadávanie údajov.
Vytvorenie a umiestnenie
🚨
NAJDÔLEŽITEJŠIE PRAVIDLO: Vždy ukladaj Entry a Button do premennej a .pack() na ďalší riadok! Keby si to dal na jeden riadok (tk.Entry().pack()), uloží sa ti hodnota None a vyskočí chyba na .get().
python
# Nadpis (Label nepotrebuje premennú, ak z neho nečítaš)tk.Label(root, text="Zadaj niečo:").pack()
# Textové políčkovstup = tk.Entry(root)
vstup.pack()
# Tlačidlo (priradí funkciu bez zátvoriek!)tlacidlo = tk.Button(root, text="Potvrdiť", command=vykreslenie)
tlacidlo.pack()
Čítanie z Entry políčka
Políčko vráti hodnotu vždy ako reťazec (String). Ak s tým ideš počítať, musíš to zabaliť do int().
Reagovanie na hardvérové akcie (klik myšou, stlačenie klávesy).
Myš – sledovanie kliku <Button-1>
python
defklik(event):
# event.x a event.y obsahujú PRESNÝ pixel kam si klikolstlpec = (event.x - 20) // 40# Výpočet stĺpca podľa pixeluprint(f"Klik na X: {event.x}, Y: {event.y}")
canvas.bind("<Button-1>", klik) # Myš viažeme na CANVAS!
Klávesnica – event.char vs event.keysym
Sú dva spôsoby. event.char dáva písmeno ako string – funguje pre čísla a bežné klávesy. Pre WASD hry a špeciálne klávesy (medzera, šípky) musíš použiť event.keysym.
python
# event.char – pre jednoduché prípady (hlasovanie číslicami atď.)defstlacenie(event):
ifevent.char == "1":
print("Stlačil si 1")
# event.keysym – pre hry (WASD, šípky, medzera, Enter)defzmena_smeru(event):
klaves = event.keysym.lower() # "w", "a", "s", "d", "space", "Return"ifklaves == "w":
print("Hore")
elifklaves == "space":
print("Medzera")
root.bind("<Key>", zmena_smeru) # Klávesnicu viažeme na ROOT!
ℹ️
Pravidlo bindovania: Myš (<Button-1>) viažeš na canvas. Klávesnicu (<Key>) viažeš na root.
5
Rovnomerné vykresľovanie do rastra
Logika rastra pre rovnomerné rozloženie objektov v cykle.
1D raster – jeden riadok objektov
python
ZACIATOK_X = 20VELKOST_STVORCA = 40MEDZERA = 10KROK = VELKOST_STVORCA + MEDZERA# Teda 50!foriinrange(5):
x = ZACIATOK_X + i * KROKcanvas.create_rectangle(x, 100, x + VELKOST_STVORCA, 100 + VELKOST_STVORCA)
2D raster – riadky a stĺpce
Vnorený cyklus pre tabuľkové rozloženie (napr. mriežka, šachovnica).
python
ZACIATOK_X = 20ZACIATOK_Y = 20KROK = 50# veľkosť + medzeraPOCET_RIADKOV = 4POCET_STLPCOV = 6forradinrange(POCET_RIADKOV):
forstlpecinrange(POCET_STLPCOV):
x = ZACIATOK_X + stlpec * KROKy = ZACIATOK_Y + rad * KROKcanvas.create_rectangle(x, y, x + 40, y + 40, outline="black")
6
Animácie a pohyb
Základ každej hry alebo pohyblivej grafiky. root.after() spúšťa funkciu po určitom čase – to vytvára herný cyklus.
Herný cyklus – root.after()
Funkcia zavolá samu seba po RYCHLOST milisekundách = animačná slučka. Nikdy tu nepoužívaj time.sleep()!
python
RYCHLOST = 50# ms medzi snímkami (50ms ≈ 20 FPS)deflogika():
# ... pohyb, kontrola kolízií, prekreslenie ...root.after(RYCHLOST, logika) # naplánuj ďalší kroklogika() # Spusti prvý krát PRED mainloop!root.mainloop()
⚠️
Funkciu píš bez zátvoriek – odovzdávaš referenciu, nie výsledok volania. root.after(50, logika) ✅ root.after(50, logika()) ❌
Pohyb objektu – canvas.move()
Posunie existujúci objekt o zadaný počet pixelov. Oveľa efektívnejšie ako delete + create.
Zmeň text, farbu alebo inú vlastnosť existujúceho objektu bez mazania a prekreslenia. Ideálne pre pohybujúce sa texty.
python
id_textu = canvas.create_text(200, 100, text="Pôvodný", fill="white")
# Zmena vlastností existujúceho objektucanvas.itemconfig(id_textu, text="Nový text", fill="red")
# Prečítanie aktuálnej hodnoty vlastnostiaktualny_text = canvas.itemcget(id_textu, "text")
print(aktualny_text) # "Nový text"
8
Práca so súbormi
Súbory môžeš otvárať na čítanie, zápis alebo pridávanie. Režim určuješ druhým parametrom v open(). Každý riadok obsahuje \n na konci – vždy použi .strip().
Textový súbor – riadok po riadku
python
VSTUP = "data.txt"withopen(VSTUP, "r", encoding="utf-8") asfr:
riadky = fr.readlines() # list riadkov, každý má \n na konciforriadokinriadky:
cisty = riadok.strip() # odstráni \n aj okolité medzeryprint(cisty)
# Prvý riadok zvlášť (napr. hlavička / max kapacita)hlavicka = riadky[0].strip()
zvysok = riadky[1:] # všetky okrem prvého
CSV zo súboru (Excel export)
CSV exportované z Excelu majú encoding="windows-1250" a stĺpce oddelené ;.
python
withopen("subor.csv", "r", encoding="windows-1250") asfr:
riadky = fr.readlines()
# Rozdeliť každý riadok podľa stredníka → list stĺpcovspracovane = [riadok.strip().split(";") forriadokinriadky]
forzaznaminspracovane:
priezvisko = zaznam[0]
meno = zaznam[1]
⚠️
Encoding: Vlastnoručne vytvorené .txt → utf-8. CSV export z Excelu → windows-1250.
Všetky režimy otvárania – "r", "w", "a"
Druhý parameter v open() určuje, čo sa s daným súborom stane. Toto je kľúčový rozdiel!
python
# "r" = READ (čítanie) – DEFAULT režim# Súbor MUSÍ existovať, inak vyhodí FileNotFoundError# Nič do neho nezapíšeš, len čítašwithopen("data.txt", "r", encoding="utf-8") asfr:
riadky = fr.readlines()
# "w" = WRITE (zápis) – POZOR: ZMAŽE celý obsah súboru!# Ak súbor neexistuje, vytvorí ho# Ak existuje, VYMAŽE všetko a začne odznovawithopen("data.txt", "w", encoding="utf-8") asfw:
fw.write("Tento riadok prepíše všetko\n")
# "a" = APPEND (pridávanie) – NEPREPÍŠE nič!# Ak súbor neexistuje, vytvorí ho# Ak existuje, PRIDÁ text na koniec (pod posledný riadok)withopen("data.txt", "a", encoding="utf-8") asfw:
fw.write("Toto sa pridá pod existujúce riadky\n")
🚨
NAJVÄČŠÍ ROZDIEL:"w" = vymaže súbor a zapíše odznova. "a" = ponechá starý obsah a pridá nové riadky na koniec. Ak chceš zbierať hlasy, objednávky alebo výsledky, vždy použi "a"!
Zápis do súboru – write() vs writelines()
write() zapíše jeden reťazec. Automaticky nepridáva nový riadok – musíš sám dať \n!
python
# write() – zapíše PRESNE to, čo mu dášwithopen("vystup.txt", "w", encoding="utf-8") asfw:
fw.write("Prvý riadok\n")
fw.write("Druhý riadok\n")
fw.write(f"ID: {id_polozky} Názov: {nazov}\n")
# writelines() – zapíše list reťazcov narazzoznam = ["riadok 1\n", "riadok 2\n", "riadok 3\n"]
withopen("vystup.txt", "w", encoding="utf-8") asfw:
fw.writelines(zoznam)
⚠️
\n je povinný!fw.write("text") nedá nový riadok. Musíš písať fw.write("text\n"), inak sa ti všetko nalepí do jedného riadku.
Praktický vzor – vyprázdni a potom zbieraj
Typický postup v úlohách: na začiatku programu súbor vyprázdniš cez "w", potom počas behu pridávaš cez "a".
python
SUBOR = "vysledky.txt"# Na začiatku programu: "w" + pass = vytvorí/vyprázdni súborwithopen(SUBOR, "w", encoding="utf-8") asfw:
pass# Počas behu: "a" pridáva riadky pod sebadefzapisat(text):
withopen(SUBOR, "a", encoding="utf-8") asfw:
fw.write(f"{text}\n")
💡
Napríklad pri ukladaní výsledkov: najprv open(SUBOR, "w") + pass na vyčistenie, potom open(SUBOR, "a") v podprograme na postupný zápis prvkov.
1
Kostra programu a vstup od používateľa
Konzolové úlohy zvyčajne riešia: (1) načítaj vstup, (2) spracuj dáta, (3) vypíš alebo zapíš výsledok. Celý kód uzatvor do funkcie – aby si ho mohol volať s rôznymi súbormi.
Vstup z klávesnice – input()
input() vždy vráti reťazec (string). Ak chceš číslo, musíš to obaliť do int() alebo float().
python
# Jeden reťazecmeno = input("Zadaj meno: ")
# Číslo – treba obaliť int() alebo float()vek = int(input("Zadaj vek: "))
# Viac hodnôt naraz oddelených medzerou → split()tipy = input("Zadaj 6 čísel: ").split() # list reťazcov# Hneď premeniť na číslacisla = [int(x) forxininput("Čísla: ").split()]
Hlavná funkcia + spustenie
Funkcia drží logiku, parameter umožní volať s rôznymi súbormi. Blok if __name__ == "__main__" je voliteľný štandard, ale stačí aj jednoduché volanie pod definíciou.
write() zapíše jeden reťazec – musíš sám pridať \n. writelines() zapíše celý list naraz (tiež bez automatického \n).
python
withopen("vystup.txt", "w", encoding="utf-8") asfw:
fw.write(f"{meno} {priezvisko}\n")
fw.write(f"{cislo:5d}\n") # zarovnanie na 5 znakovfw.write(f"{meno:<20}{vek}\n") # stĺpec šírka 20
CSV (oddeľovač + viaceré stĺpce)
python
withopen("data.csv", "r", encoding="windows-1250") asfr:
riadky = fr.readlines()
# List comprehension: každý riadok rozdeliť podľa ;tabulka = [r.strip().split(";") forrinriadky]
forzaznamintabulka:
stlpec1 = zaznam[0]
stlpec2 = zaznam[1]
3
Spracovanie reťazcov
Reťazce sú základ – textové dáta zo súborov a vstupu. Tieto metódy potrebuješ pri každej úlohe.
Rozdelenie a spojenie – split() / join()
python
# split() bez argumentu = rozdelí podľa BIELYCH znakov (medzery, taby, \n)slova = "ahoj svet python".split() # ["ahoj", "svet", "python"]# split(",") = rozdelí podľa konkrétneho znakucasti = "Janko;Mrkvička;15".split(";") # ["Janko", "Mrkvička", "15"]# split(" ", 2) = rozdelí maximálne 2-krát (= 3 časti)prve_dve = "a b c d e".split(" ", 2) # ["a", "b", "c d e"]# join() = opak split – spojí list reťazcovveta = " ".join(["ahoj", "svet"]) # "ahoj svet"csv = ";".join(["a", "b", "c"]) # "a;b;c"bezmedz = "".join(["a", "b", "c"]) # "abc"
⚠️
join() funguje LEN s listom reťazcov! Ak máš čísla, premeň: ", ".join(map(str, cisla)) alebo ", ".join(str(c) for c in cisla).
Čistenie a zmena – strip, replace, upper, lower
python
" ahoj \n".strip() # "ahoj" – orezáva oba okraje"ahoj".upper() # "AHOJ""AHOJ".lower() # "ahoj""12,5".replace(",", ".") # "12.5" – nahradí všetky výskyty"+12".replace("+", "") # "12" – odstránenie znaku"abcabc".count("a") # 2 – počet výskytov"ABC".find("B") # 1 – index prvého výskytu (-1 ak nie je)
Rezanie reťazca – [a:b] a [::-1]
python
s = "Python"s[0] # "P" – prvý znaks[-1] # "n" – posledný znaks[0:3] # "Pyt" – od 0 (vrátane) po 3 (BEZ)s[1:-1] # "ytho" – bez prvého a poslednéhos[:3] # "Pyt" – od začiatkus[3:] # "hon" – po koniecs[::-1] # "nohtyP" – OBRÁTENIE reťazca!
Testovacie metódy – isalpha, isdigit
python
"abc".isalpha() # True – obsahuje LEN písmená"abc1".isalpha() # False – obsahuje aj číslo"123".isdigit() # True – obsahuje LEN číslice"abc".isupper() # False – nie je veľkými písmenami"ABC".isupper() # True
ASCII konverzia – chr() a ord()
Pre úlohy na šifrovanie/posunutie znakov v abecede.
python
ord("a") # 97 – ASCII kód znakuord("A") # 65chr(97) # "a" – znak z ASCII kódu# Posunutie písmena o 3 v abecedeposun = chr(ord("a") + 3) # "d"
4
Listy (zoznamy)
List drží postupnosť hodnôt – v poradí, prístup cez index. Najčastejšia dátová štruktúra.
Základné operácie
python
zoznam = []
zoznam.append("a") # pridá na konieczoznam.extend(["b", "c"]) # pridá viacero narazzoznam.remove("a") # odstráni prvý výskytzoznam.pop() # odstráni a vráti poslednýzoznam.pop(0) # odstráni a vráti prvýlen(zoznam) # dĺžka"a"inzoznam# True/False – či obsahujezoznam[0] # prvý prvokzoznam[-1] # posledný prvokzoznam[1:3] # pod-list (rovnaký princíp ako string slicing)
Triedenie – sort() vs sorted()
sort() mení samotný list. sorted() vráti novú zoradenú kópiu.
Stručný zápis pre vytvorenie listu pomocou cyklu. Forma: [výraz for prvok in zdroj if podmienka].
python
# Druhé mocniny 0–4stvorce = [x ** 2forxinrange(5)] # [0, 1, 4, 9, 16]# Konverzia listu reťazcov na číslacisla = [int(x) forxin ["1", "2", "3"]] # [1, 2, 3]# Strip + split každého riadku zo súborutabulka = [r.strip().split(";") forrinriadky]
# S podmienkou – len párneparne = [xforxinrange(10) ifx % 2 == 0]
5
Slovníky (dict) a zoznam záznamov
Slovník je kľúč → hodnota. List slovníkov je najčastejší spôsob ako udržať tabuľkové dáta (každý riadok = záznam).
Základné operácie so slovníkom
python
osoba = {"meno": "Janko", "vek": 20}
osoba["meno"] # "Janko"osoba["vek"] = 21# úprava hodnotyosoba["email"] = "a@b.sk"# pridanie nového kľúča"meno"inosoba# True – či kľúč existujeosoba.get("email", "–") # bezpečné získanie s defaultomforkluc, hodnotainosoba.items():
print(kluc, ":", hodnota)
Vytvorenie záznamov zo súboru (list dictov)
Toto je najčastejší vzor v maturitných úlohách. Každý riadok = jeden záznam = jeden slovník v liste.
python
withopen("data.txt", "r", encoding="utf-8") asfr:
riadky = fr.readlines()
zaznamy = []
forriadokinriadky:
meno, priezvisko, vek = riadok.strip().split() # rozbaleniezaznamy.append({
"meno": meno,
"priezvisko": priezvisko,
"vek": int(vek)
})
# Prístup k poliam záznamuforzinzaznamy:
print(f"{z['meno']} má {z['vek']} rokov")
💡
Číslo vždy obaľ do int() už pri vytváraní záznamu – inak ti zostane reťazec a neporovnáš ho ako číslo.
Dict comprehension a počítanie kategórií
Klasická úloha: spočítaj, koľkokrát sa každá hodnota vyskytuje.
python
# Dict comprehension – inicializácia na 0pocty = {znak: 0forznakin"ABCDEFGHIJKLMNOPQRSTUVWXYZ"}
# Vzor: ak kľúč nie je v dicte, založ ho na 1, inak zvýšpocty_krajin = {}
forzinzaznamy:
krajina = z["krajina"]
ifkrajinanotinpocty_krajin:
pocty_krajin[krajina] = 1else:
pocty_krajin[krajina] += 1# Výpis výsledkovforkrajina, pocetinpocty_krajin.items():
print(f"{krajina}: {pocet}")
6
Min, Max, počítanie a priemer
Vstavané funkcie min, max, sum, len ti ušetria desiatky riadkov cyklov.
Min/Max/Sum nad listom čísel
python
cisla = [10, 5, 8, 3, 12]
max(cisla) # 12min(cisla) # 3sum(cisla) # 38len(cisla) # 5# Priemerpriemer = sum(cisla) / len(cisla) # 7.6# Maximum z viacerých argumentov (nie listu)max(3, 7, 2) # 7
Max so záznamami – key=lambda
Ak máš list slovníkov, povedz Pythonu podľa čoho hľadať max. lambda je „rýchla funkcia" v jednom riadku.