Návrh uživatelského rozhraní pomocí CustomTkinter
Doposud jsme si v Pythonu vytvářeli programy, které běžely v konzoli. Na příkazové řádce jsme vypisovali text, přijímali vstupy a občas i počítali výsledky. Takové programy ale nejsou pro běžného uživatele moc přívětivé.
Když uživatel spustí program, očekává okno, tlačítka, vstupní pole, barvy a příjemné prostředí. Právě proto existuje GUI – Graphical User Interface, česky grafické uživatelské rozhraní.
V předchozí kapitole jsme poznali Tkinter, což je jednoduchá knihovna pro tvorbu GUI, která je součástí Pythonu. Tkinter je skvělý na pochopení principů – naučí nás, co je to „okno“, jak do něj vložit tlačítko, textové pole a jak reagovat na kliknutí. Jeho jedinou nevýhodou je, že vzhled je zastaralý.
Aby aplikace vypadaly moderně, vznikla knihovna CustomTkinter. Je založena na Tkinteru, ale přidává moderní vzhled, zaoblené rohy, podporu tmavého i světlého režimu, a umožňuje vytvářet aplikace, které vypadají profesionálně.
Instalace
Protože CustomTkinter není součástí Pythonu, musíme ho nejprve nainstalovat.
Použijeme k tomu standardní nástroj pip.
pip install customtkinter

Po instalaci můžeme knihovnu naimportovat příkazem
import customtkinter as ctk
Tím říkáme, že v kódu budeme knihovnu oslovovat zkratkou ctk.
Je to jen pro zjednodušení – abychom nemuseli psát dlouhé customtkinter.CTkButton, ale jen ctk.CTkButton.
První okno
import customtkinter as ctk # načteme knihovnu
# Nastavení vzhledu celé aplikace
ctk.set_appearance_mode("System") # může být "Light", "Dark" nebo "System"
ctk.set_default_color_theme("blue") # barevné téma aplikace
# Vytvoření hlavního okna
okno = ctk.CTk()
okno.title("Moje první aplikace v CTk")
okno.geometry("400x250")
# Přidáme popisek
popisek = ctk.CTkLabel(okno, text="Vítej v CustomTkinteru", font=("Arial", 18))
popisek.pack(pady=20)
# Přidáme tlačítko
def stisknuto():
print("Tlačítko bylo stisknuto!")
tlacitko = ctk.CTkButton(okno, text="Klikni na mě", command=stisknuto)
tlacitko.pack(pady=10)
# Spustíme hlavní smyčku aplikace
okno.mainloop()
- Načítáme knihovnu
customtkintera dáváme jí přezdívkuctk. - Nastavíme vzhled
set_appearance_mode("System")– aplikace se přizpůsobí systému (světlý/tmavý režim).set_default_color_theme("blue")– výchozí barvy (může být i"green"nebo"dark-blue").
- Vytvoříme okno
ctk.CTk()vytvoří hlavní okno.title()nastaví název okna (zobrazí se v záhlaví).geometry("400x250")určuje velikost okna (šířka x výška v pixelech).
- Přidáme textový popisek
CTkLabelzobrazí text.pady=20znamená 20 pixelů volného místa nahoře a dole.
- Přidáme tlačítko (button)
command=stisknutourčuje, co se stane, když na tlačítko klikneš.- Funkce
stisknuto()vypíše text do konzole.
- Použijeme hlavní smyčku
mainloop()udržuje okno „naživu“. Program běží, dokud ho uživatel nezavře.

Základní stavební prvky (widgety)
„Widget“ je jakýkoli ovládací prvek v okně – tlačítko, textové pole, popisek, posuvník apod.
V CustomTkinteru jsou všechny widgety pojmenované stejně jako v Tkinteru, jen mají předponu CTk.
| Tkinter | CustomTkinter |
|---|---|
| Label | CTkLabel |
| Button | CTkButton |
| Entry | CTkEntry |
| Text | CTkTextbox |
| Frame | CTkFrame |
| Checkbutton | CTkCheckBox |
| Radiobutton | CTkRadioButton |
CTkLabel – popisek
Popisek slouží ke zobrazení textu nebo informací.
popisek = ctk.CTkLabel(okno, text="Toto je popisek", font=("Arial", 16, "bold"), text_color="white", fg_color="darkblue")
popisek.pack(pady=10)
text– co se má zobrazitfont– písmo (název, velikost, styl)text_color– barva textufg_color– barva pozadí
Pokud nechceme mít žádné pozadí, necháme fg_color=None

CTkButton – tlačítko
Tlačítko může spustit funkci, když na něj uživatel klikne.
def klik():
print("Klik!")
tlacitko = ctk.CTkButton(okno, text="Klikni na mě", command=klik, fg_color="green", hover_color="darkgreen")
tlacitko.pack(pady=10)
command=klikříká, že se má po kliknutí spustit funkceklik()- Barvy
fg_colorahover_colorurčují barvu tlačítka a jeho barvu při najetí myší.

CTkEntry – jednořádkové textové pole
Slouží k zadávání textu od uživatele.
vstup = ctk.CTkEntry(okno, placeholder_text="Zadej své jméno...")
vstup.pack(pady=10)
def odeslat():
jmeno = vstup.get()
print(f"Ahoj, {jmeno}!")
ctk.CTkButton(okno, text="Odeslat", command=odeslat).pack(pady=10)
- get() vrací text, který uživatel zadal.
- placeholder_text je šedý text, který zmizí po kliknutí do pole.

CTkTextbox – víceřádkové pole
Pro delší text, např. poznámky nebo zprávy.
text = ctk.CTkTextbox(okno, width=300, height=100)
text.insert("1.0", "Sem můžeš napsat libovolný text.")
text.pack(pady=10)
"1.0"znamená první řádek, první znak.insert()vloží text.

CTkCheckBox – zaškrtávací políčko
Umožňuje vybrat ANO/NE, zapnuto/vypnuto.
souhlas = ctk.BooleanVar()
check = ctk.CTkCheckBox(okno, text="Souhlasím s podmínkami", variable=souhlas)
check.pack(pady=5)
def kontrola():
print("Souhlas:", souhlas.get())
ctk.CTkButton(okno, text="Zkontroluj", command=kontrola).pack(pady=5)
BooleanVar()ukládáTrueneboFalse
Když uživatel políčko zaškrtne, proměnná se automaticky změní.

CTkRadioButton – výběr jedné možnosti
Umožňuje zvolit jednu z několika možností.
volba = ctk.StringVar(value="")
r1 = ctk.CTkRadioButton(okno, text="Pes", variable=volba, value="pes")
r2 = ctk.CTkRadioButton(okno, text="Kočka", variable=volba, value="kočka")
r1.pack()
r2.pack()
def zobraz():
print("Vybráno:", volba.get())
ctk.CTkButton(okno, text="Zobraz volbu", command=zobraz).pack(pady=10)
StringVar()ukládá textovou hodnotu vybrané možnosti
Při kliknutí na tlačítko se z volba.get() zjistí aktuální výběr.

CTkSlider – posuvník hodnot
def zmena(value):
print("Aktuální hodnota:", round(value, 1))
slider = ctk.CTkSlider(okno, from_=0, to=100, command=zmena)
slider.pack(pady=10)
- Parametr
from_atourčuje rozsah posuvníku - Funkce
commandse volá vždy, když se posuvník pohne

CTkProgressBar – indikátor průběhu
progress = ctk.CTkProgressBar(okno)
progress.pack(pady=10)
progress.set(0.5) # 50 %
- Hodnota
set(0.5)znamená 50 %

CtKOptionMenu – rozbalovací nabídka
vyber = ctk.StringVar(value="Modrá") # výchozí hodnota
menu = ctk.CTkOptionMenu(okno, values=["Modrá", "Zelená", "Červená"], variable=vyber)
menu.pack(pady=10)
def zobraz_vyber():
print("Vybral jsi:", vyber.get())
ctk.CTkButton(okno, text="Zobraz výběr", command=zobraz_vyber).pack(pady=10)
- CTkOptionMenu vytváří rozbalovací nabídku.
- values určuje seznam možností, které se zobrazí.
- variable (typicky
StringVar) uchovává právě zvolenou hodnotu. - value=“Modrá“ nastaví výchozí zobrazenou položku.
- Pomocí
vyber.get()zjistíš aktuální výběr.

Rozvržení prvků (layout)
Když vytváříme aplikaci, musíme říct, kam se mají jednotlivé prvky umístit.
Tkinter (a tím pádem i CustomTkinter) nám nabízí tři základní způsoby rozmístění, tzv. layouty:
| Název metody | Jak funguje | Kdy ji použít |
|---|---|---|
.pack() | Umísťuje prvky pod sebe nebo vedle sebe podle pořadí | pro jednoduché okna |
.grid() | Rozděluje okno na tabulku (mřížku) řádků a sloupců | pro formuláře, přihlašování, kalkulačky |
.place() | Umísťuje prvky přesně podle souřadnic (x, y) | pro přesné rozmístění nebo speciální efekty |
Layout PACK
pack() je nejjednodušší způsob rozložení.
Představ si ho jako lepení prvků pod sebe nebo vedle sebe.
Každý prvek, který použiješ s .pack(), se přidá do okna podle pořadí, v jakém ho napíšeš.
První prvek nahoře, další pod ním, a tak dále.
import customtkinter as ctk
app = ctk.CTk()
app.title("Ukázka layoutu PACK")
app.geometry("300x250")
tlacitko1 = ctk.CTkButton(app, text="Horní tlačítko")
tlacitko1.pack(side="top", pady=10)
tlacitko2 = ctk.CTkButton(app, text="Spodní tlačítko")
tlacitko2.pack(side="bottom", pady=10)
tlacitko3 = ctk.CTkButton(app, text="Vlevo")
tlacitko3.pack(side="left", padx=10, pady=10)
tlacitko4 = ctk.CTkButton(app, text="Vpravo")
tlacitko4.pack(side="right", padx=10, pady=10)
app.mainloop()
side="top"– prvek se přilepí k hornímu okraji (výchozí nastavení)side="bottom"– přilepí se k dolnímu okrajiside="left"– k levé straněside="right"– k pravé straněpadx,pady– mezery kolem prvkuipadx,ipady– vnitřní odsazení uvnitř prvku (rozšíří ho)fill="x"– prvek se roztáhne do šířkyexpand=True– prvek se roztáhne, pokud je v okně volné místo

Tlačítko přes celou šířku:
tlacitko = ctk.CTkButton(app, text="Vyplň šířku", fg_color="darkblue")
tlacitko.pack(fill="x", padx=20, pady=10)

Layout GRID
Když chceš prvky umístit přesněji, použij metodu grid().
Ta rozdělí okno do řádků a sloupců, podobně jako tabulka v Excelu.
Každý prvek umístíš do určité buňky podle čísel:
- první řádek má číslo
0 - první sloupec má číslo
0 - buňka v levém horním rohu je tedy
(row=0, column=0)
import customtkinter as ctk
app = ctk.CTk()
app.title("Přihlašovací formulář")
app.geometry("350x200")
# Popisky
ctk.CTkLabel(app, text="Uživatelské jméno:").grid(row=0, column=0, padx=5, pady=5, sticky="e")
ctk.CTkLabel(app, text="Heslo:").grid(row=1, column=0, padx=5, pady=5, sticky="e")
# Vstupní pole
entry_jmeno = ctk.CTkEntry(app, placeholder_text="např. pospisill")
entry_jmeno.grid(row=0, column=1, padx=5, pady=5)
entry_heslo = ctk.CTkEntry(app, show="*")
entry_heslo.grid(row=1, column=1, padx=5, pady=5)
# Tlačítko
tlacitko = ctk.CTkButton(app, text="Přihlásit se", command=lambda: print("Přihlášeno!"))
tlacitko.grid(row=2, column=0, columnspan=2, pady=10)
app.mainloop()
row= číslo řádku (od 0)column= číslo sloupce (od 0)columnspan=2= prvek zabere dva sloupcesticky="e"= zarovná doprava (east)- n (nahoře) – north
- s (dole) – south
- e (vpravo) – east
- w (vlevo) – west
- nsew – roztáhne prvek do všech směrů
padx,pady= mezery kolem prvku

Responzivní grid
Můžeš říct, které řádky a sloupce se mají roztahovat při změně velikosti okna.
app.grid_rowconfigure(0, weight=1)
app.grid_rowconfigure(1, weight=1)
app.grid_columnconfigure(0, weight=1)
app.grid_columnconfigure(1, weight=2)
weight určuje, jak moc se prvek roztáhne – větší číslo = víc prostoru
Layout PLACE
place() je nejpřesnější, ale také nejnáročnější.
Používá souřadnice x a y nebo relativní pozice (v procentech).
ctk.CTkLabel(app, text="Nadpis", font=("Arial", 18)).place(x=100, y=30)
ctk.CTkButton(app, text="Start").place(x=120, y=100)
(x=100, y=30)znamená, že prvek začíná 100 pixelů od levého okraje a 30 pixelů od horního.

Relativní pozice:
ctk.CTkButton(app, text="Uprostřed").place(relx=0.5, rely=0.5, anchor="center")
relx=0.5arely=0.5= střed oknaanchor="center"určuje, že se střed tlačítka zarovná na tuto pozici

Rámečky (CTkFrame)
Rámeček (frame) je něco jako vnořené okno – kontejner, do kterého můžeš umístit další prvky.
Umožňuje rozdělit okno na části (např. levé menu a pravý obsah).
import customtkinter as ctk
app = ctk.CTk()
app.title("Rámečky v aplikaci")
app.geometry("500x300")
# Levý rámec (menu)
levy = ctk.CTkFrame(app, width=150, fg_color="#99ccff")
levy.pack(side="left", fill="y")
# Pravý rámec (obsah)
pravy = ctk.CTkFrame(app, fg_color="#e0e0e0")
pravy.pack(side="right", fill="both", expand=True)
# Prvky v levém rámu
ctk.CTkLabel(levy, text="Menu", font=("Arial", 14, "bold")).pack(pady=10)
ctk.CTkButton(levy, text="Domů").pack(pady=5)
ctk.CTkButton(levy, text="Nastavení").pack(pady=5)
# Prvky v pravém rámu
ctk.CTkLabel(pravy, text="Zde se bude měnit obsah...").pack(pady=20)
app.mainloop()
- Máme dvě části okna – levé menu a pravý obsah.
- Každý frame má vlastní barvu a může používat svůj layout (
pack,gridneboplace). - Uvnitř každého rámce můžeš vytvářet libovolné widgety, aniž by se „překřížily“ s těmi v druhém rámu.

Interaktivita
V tuto chvíli už umíme vytvořit okno, umístit do něj tlačítka, popisky i vstupní pole.
Ale zatím všechno jen „stojí“ – nic se neděje, dokud to sami nenaprogramujeme.
Teď si ukážeme, jak aplikaci oživit.
Změna obsahu pomocí funkce a command=
Každé tlačítko může spustit nějakou funkci.
import customtkinter as ctk
app = ctk.CTk()
app.title("Změna textu")
app.geometry("300x200")
# Popisek (bude se měnit)
popisek = ctk.CTkLabel(app, text="Původní text", font=("Arial", 16))
popisek.pack(pady=20)
# Funkce, která změní text
def zmen_text():
popisek.configure(text="MěSOŠ, škola jak se patří", text_color="green")
# Tlačítko
tlacitko = ctk.CTkButton(app, text="Změň text", command=zmen_text)
tlacitko.pack(pady=10)
app.mainloop()
configure()umožňuje změnit vlastnosti prvku za běhu (např. text, barvu, velikost).- Kliknutím na tlačítko se zavolá funkce
zmen_text(), která:- přepíše text v popisku (
text="...") - změní barvu (
text_color="green")
- přepíše text v popisku (


Přepínání textu – přepínač
Někdy chceme, aby se prvek střídal mezi dvěma stavy (např. „Zapnuto / Vypnuto“).
import customtkinter as ctk
app = ctk.CTk()
app.title("Světlo")
app.geometry("300x200")
stav = False # výchozí stav
def prepni():
global stav
if stav:
popisek.configure(text="Světlo zhasnuto", text_color="gray")
else:
popisek.configure(text="Světlo rozsvíceno", text_color="yellow")
stav = not stav # přepne hodnotu True/False
popisek = ctk.CTkLabel(app, text="Světlo zhasnuto")
popisek.pack(pady=20)
ctk.CTkButton(app, text="Přepni světlo", command=prepni).pack(pady=10)
app.mainloop()


Získávání vstupu od uživatele – .get()
Interakce není jen o klikání – často potřebujeme, aby uživatel něco napsal.
Používáme k tomu widget Entry, který známe z dřívějška.
import customtkinter as ctk
app = ctk.CTk()
app.title("Světlo")
app.geometry("300x200")
stav = False # výchozí stav
def prepni():
global stav
if stav:
popisek.configure(text="Světlo zhasnuto", text_color="gray")
else:
popisek.configure(text="Světlo rozsvíceno", text_color="yellow")
stav = not stav # přepne hodnotu True/False
popisek = ctk.CTkLabel(app, text="Světlo zhasnuto")
popisek.pack(pady=20)
ctk.CTkButton(app, text="Přepni světlo", command=prepni).pack(pady=10)
app.mainloop()
.get()= načtení dat z textového pole.configure()= úprava textu podle potřeby


Události (events) a metoda .bind()
Metoda bind() umožňuje reagovat na konkrétní události:
- pohyb myši,
- kliknutí,
- stisk klávesy,
- dvojklik atd.
Každý widget (např. tlačítko, popisek nebo okno) může poslouchat určité události a spustit při nich funkci.
widget.bind("<událost>", funkce)
- Funkce musí přijímat jeden parametr – tzv. event object, který obsahuje informace o události (např. jaká klávesa byla stisknuta, kde je myš…).
import customtkinter as ctk
app = ctk.CTk()
app.geometry("400x250")
app.title("Sledování pohybu myši")
popisek = ctk.CTkLabel(app, text="Pohybuj myší nad oknem")
popisek.pack(pady=40)
def pohyb(event):
popisek.configure(text=f"x={event.x}, y={event.y}")
# celá aplikace reaguje na pohyb myši
app.bind("<Motion>", pohyb)
app.mainloop()
- Co dělá
event.xaevent.yxayjsou souřadnice myši v aktuálním okně- po každém pohybu se zavolá funkce
pohyb(), která přepíše text v popisku

Reakce na klávesnici
Zachytávání kláves funguje podobně – opět pomocí .bind().
import customtkinter as ctk
app = ctk.CTk()
app.title("Zachycení kláves")
app.geometry("400x200")
label = ctk.CTkLabel(app, text="Stiskni libovolnou klávesu...")
label.pack(pady=40)
def klavesa(event):
label.configure(text=f"Stiskl jsi: {event.keysym}")
app.bind("<KeyPress>", klavesa)
app.mainloop()
"<KeyPress>"= jakmile se stiskne jakákoli klávesaevent.keysym= obsahuje název klávesy (např. „a“, „Shift“, „Return“)

Práce s více okny
Doteď jsme tvořili jednoduché aplikace, které měly jen jedno okno – například formulář nebo tlačítka.
Ale co když chceme, aby uživatel mohl přejít na další obrazovku (např. z přihlašování do hlavní nabídky)?
Nebo otevřít nové okno se zvláštním obsahem?
To už potřebujeme dvě různé věci:
- CTkToplevel – vytvoří nové samostatné okno (např. „O aplikaci“).
- Frame přepínání – umožní měnit obsah hlavního okna bez otevírání nového.
Nové samostatné okno – CTkToplevel
Zkusme si vytvořit program, který má hlavní okno a tlačítko „O aplikaci“.
Po kliknutí se otevře nové malé okno s informacemi.
import customtkinter as ctk
app = ctk.CTk()
app.title("Více oken - CTkToplevel")
app.geometry("400x250")
def otevri_okno():
nove_okno = ctk.CTkToplevel(app)
nove_okno.title("O aplikaci")
nove_okno.geometry("300x150")
ctk.CTkLabel(nove_okno, text="Tato aplikace byla vytvořena\nv CustomTkinteru.", justify="center").pack(pady=20)
ctk.CTkButton(nove_okno, text="Zavřít", command=nove_okno.destroy).pack(pady=10)
ctk.CTkLabel(app, text="Hlavní okno").pack(pady=30)
ctk.CTkButton(app, text="O aplikaci", command=otevri_okno).pack()
app.mainloop()
CTkToplevel(app)– vytvoří nové okno, které je „nadřazené“ hlavnímu.destroy()– zavře dané okno.- Můžeš mít libovolný počet oken. Každé funguje samostatně.

Přepínání obrazovek v jednom okně – CTkFrame
Otevírat nové okno není vždy ideální – někdy je lepší měnit obsah v tom stejném okně.
Například po přihlášení nechceš, aby se otevřelo nové okno, ale aby se prostě změnil obsah na „hlavní menu“.
Toho dosáhneme pomocí rámců (CTkFrame) – každý frame představuje jednu „obrazovku“ aplikace.
Stačí zobrazit ten správný a ostatní skrýt.
import customtkinter as ctk
app = ctk.CTk()
app.title("Více oken - CTkToplevel")
app.geometry("400x250")
def otevri_okno():
nove_okno = ctk.CTkToplevel(app)
nove_okno.title("O aplikaci")
nove_okno.geometry("300x150")
ctk.CTkLabel(nove_okno, text="Tato aplikace byla vytvořena\nv CustomTkinteru.", justify="center").pack(pady=20)
ctk.CTkButton(nove_okno, text="Zavřít", command=nove_okno.destroy).pack(pady=10)
ctk.CTkLabel(app, text="Hlavní okno").pack(pady=30)
ctk.CTkButton(app, text="O aplikaci", command=otevri_okno).pack()
app.mainloop()
pack_forget()= prvek (nebo frame) se skryje.pack()= prvek se znovu zobrazí.- Díky tomu se dá jednoduše přepínat mezi „obrazovkami“ v jedné aplikaci.


OOP v GUI
Když aplikace roste, stává se kód nepřehledný.
Proto se v praxi GUI často píše pomocí tříd.
Každá část aplikace má svoji vlastní třídu – např. jedna třída pro přihlašovací okno, druhá pro hlavní menu.
import customtkinter as ctk
# --- Třída hlavní aplikace ---
class MojeAplikace(ctk.CTk):
def __init__(self):
super().__init__()
self.title("OOP - Přepínání obrazovek")
self.geometry("400x250")
self.frame_login = LoginFrame(self)
self.frame_main = MainFrame(self)
self.zobraz_login()
def zobraz_login(self):
self.frame_main.pack_forget()
self.frame_login.pack(fill="both", expand=True)
def zobraz_main(self):
self.frame_login.pack_forget()
self.frame_main.pack(fill="both", expand=True)
# --- Přihlašovací obrazovka ---
class LoginFrame(ctk.CTkFrame):
def __init__(self, master):
super().__init__(master)
ctk.CTkLabel(self, text="Přihlašovací obrazovka").pack(pady=10)
self.jmeno = ctk.CTkEntry(self, placeholder_text="Jméno")
self.jmeno.pack(pady=5)
self.heslo = ctk.CTkEntry(self, placeholder_text="Heslo", show="*")
self.heslo.pack(pady=5)
ctk.CTkButton(self, text="Přihlásit se", command=self.prihlasit).pack(pady=10)
def prihlasit(self):
# Tady by mohla být kontrola jména a hesla
self.master.zobraz_main()
# --- Hlavní menu ---
class MainFrame(ctk.CTkFrame):
def __init__(self, master):
super().__init__(master)
ctk.CTkLabel(self, text="Vítej v hlavním menu!", font=("Arial", 16)).pack(pady=20)
ctk.CTkButton(self, text="Odhlásit se", command=master.zobraz_login).pack(pady=10)
# --- Spuštění aplikace ---
app = MojeAplikace()
app.mainloop()
class MojeAplikace(ctk.CTk)- hlavní třída, která dědí z hlavního okna CustomTkinteru.
self.frame_loginaself.frame_main- jsou objekty dvou „obrazovek“.
zobraz_login()azobraz_main()- metody, které přepínají mezi nimi.
LoginFrameaMainFrame- každá třída se stará o svou část GUI.
Můžeš si to představit jako dům (aplikaci), který má více místností (frame).
Každá místnost má svůj vlastní nábytek (widgety).
Metoda zobraz_main() jen zavře jedny dveře a otevře druhé — a ty přejdeš do jiné místnosti
Komplexní příklad
import customtkinter as ctk
app = ctk.CTk()
app.title("BMI Kalkulačka")
app.geometry("350x300")
# Nadpis
ctk.CTkLabel(app, text="BMI kalkulačka", font=("Arial", 18, "bold")).pack(pady=10)
# Vstupní pole
ctk.CTkLabel(app, text="Výška (cm):").pack()
vyska = ctk.CTkEntry(app)
vyska.pack(pady=5)
ctk.CTkLabel(app, text="Hmotnost (kg):").pack()
hmotnost = ctk.CTkEntry(app)
hmotnost.pack(pady=5)
# Výsledek
vysledek = ctk.CTkLabel(app, text="", font=("Arial", 14))
vysledek.pack(pady=10)
# Funkce pro výpočet
def spocitej_bmi():
try:
v = float(vyska.get()) / 100 # přepočet na metry
h = float(hmotnost.get())
bmi = h / (v ** 2)
if bmi < 18.5:
stav = "Podváha"
elif bmi < 25:
stav = "V normě"
elif bmi < 30:
stav = "Nadváha"
else:
stav = "Obezita"
vysledek.configure(text=f"BMI: {bmi:.2f} ({stav})")
except:
vysledek.configure(text="Zadej čísla!", text_color="red")
# Tlačítko
ctk.CTkButton(app, text="Vypočítat", command=spocitej_bmi).pack(pady=10)
app.mainloop()
.get()načítá hodnoty z polí.- Používáme
try/except, aby program nespadl při chybném vstupu. .configure()mění text i barvu výsledku.


Zdroje
Seznam zdrojů
itnetwork.cz. Online. Dostupné z: https://www.itnetwork.cz/.
w3schools.com. Online. Dostupné z: https://www.w3schools.com/.
Python 3 documentation. Online. Dostupné z: https://docs.python.org/3/
SMOLKA, Pavel. Programovací jazyk Python [online]. Mendelova univerzita v Brně, 2019. Dostupné z: https://emendelu.publi.cz/book/771-programovaci-jazyk-python-pruvodce-studiem
ŠVEC, Jan. Učebnice jazyka Python (aneb Létající cirkus) [online]. 2002. Dostupné z: https://i.iinfo.cz/files/root/k/Ucebnice_jazyka_Python.pdf
PILGRIM, Mark. Ponořme se do Python(u) 3: Dive into Python 3. CZ.NIC. Praha: CZ.NIC, c2010. ISBN 978-80-904248-2-1.
PECINOVSKÝ, Rudolf. Python: kompletní příručka jazyka pro verzi 3.11. Knihovna programátora (Grada). Praha: Grada Publishing, 2023. ISBN 978-80-271-3891-3.
Další zdroje (Youtube, obrázky) jsou vždy uvedeny.
