Toto je jádro celé hodiny. Teď navážeme na myšlenku z první hodiny důkladněji.
Tenhle jeden řádek dělá dvě věci. Nakreslí posuvník na stránku a zároveň vrátí číslo, na kterém posuvník právě stojí. To číslo si uložíme do proměnné a pracujeme s ním dál jako s obyčejným číslem.
Že to opravdu je normální číslo, si můžeš ověřit takhle:
Zamysli se: „Kolikrát se ten řádek se sliderem provede, když posuvníkem pohnu?" Odpověď: celý skript se spustí znovu odshora, takže jednou při každém pohnutí.
Tady poprvé narazíte na to, že funkce mají poziční a klíčové parametry.
st.slider("Životy", 0, 100, 72)
# popisek min max výchozí
Poziční znamená, že záleží na pořadí. Kdyby dítě napsalo st.slider("Životy", 100, 0, 72),
dostane chybu, protože minimum nemůže být větší než maximum.
Klíčové parametry se píší se jménem a na pořadí nezáleží:
st.slider("Životy", min_value=0, max_value=100, value=72, step=5)
Když napíšeš jméno parametru, je to jasnější a nemusíš hlídat pořadí. U složitějších funkcí se to vyplatí.
Toto je koncept, který budete potřebovat v 10. hodině u vlastních funkcí. Zasejte semínko už teď.
Tahák pro rychlé zopakování:
| Widget | Vrací | Použití ve hře |
|---|---|---|
st.text_input("Jméno") |
text (str) |
jméno hrdiny |
st.number_input("Věk", 1, 99) |
číslo | přesná hodnota |
st.slider("Síla", 1, 20, 10) |
číslo | statistiky |
st.select_slider("Obtížnost", ["Lehká","Těžká"]) |
vybraná položka | obtížnost |
st.selectbox("Povolání", ["Bojovník","Mág"]) |
vybraná položka | výběr z nabídky |
st.multiselect("Vybavení", [...]) |
seznam vybraných | více voleb najednou |
st.radio("Vzhled", ["🧙","🗡️"]) |
vybraná položka | přepínač |
st.checkbox("Má klíč") |
True / False |
ano/ne volba |
st.toggle("Zapnout kouzla") |
True / False |
hezčí checkbox |
st.color_picker("Barva") |
text "#rrggbb" |
vzhled |
st.button("Zaútočit") |
True jen po kliknutí |
akce |
Zamysli se nad otázkou:
Slider je rychlý, ale nepřesný — těžko na něm trefíš přesně 47. Number_input je přesný, ale pomalejší. Ve hře používáme slider tam, kde chceme, aby si člověk hrál, a number_input tam, kde chceme přesnou hodnotu.
Tahle chyba tě může překvapit:
Co se děje na pozadí: Streamlit identifikuje widget podle typu a parametrů. Dva identické widgety mají stejné ID a Streamlit neví, který je který.
Dvě řešení:
Každý prvek na stránce musí být rozeznatelný. Buď má jiný nápis, nebo mu dáme jmenovku pomocí
key.
Tohle zadání bývá hodně zábavné, protože obsahuje skutečné herní rozhodování.
Proč je CELKEM napsané velkými písmeny:
Velká písmena používáme pro hodnoty, které se během programu nikdy nemění. Je to jen dohoda mezi programátory, Python to nehlídá. Ale kdo to čte, hned pozná, že tohle číslo je pravidlo hry, ne proměnná.
| Chyba | Příčina | Řešení |
|---|---|---|
DuplicateWidgetID |
Dva stejné widgety | Změnit popisek nebo přidat key="..." |
StreamlitAPIException: value must be between |
Výchozí hodnota mimo rozsah | st.slider("X", 0, 10, 50) → opravit |
| Číslo se chová jako text | Použili text_input místo number_input |
Přetypovat int() nebo změnit widget |
| Widget je vidět, ale hodnota se nepoužije | Zapomenuté přiřazení do proměnné | x = st.slider(...) |
| Tlačítko nic nedělá | Kód není v if st.button(...) |
Odsadit |
Tvoje zadání:
Vyzkoušej si všechny ovládací prvky a zjisti, co který vrací.
- Přidej
st.text_inputa hodnotu ulož do proměnné- Přidej
st.sliders rozsahem 1 až 20- Přidej
st.selectboxalespoň se třemi možnostmi- Přidej
st.checkboxast.color_picker- Pod všechno vypiš hodnoty všech proměnných a jejich typ pomocí
type(promenna).__name__
| Úroveň | Co má zvládnout |
|---|---|
| Minimum | Body 1–4, prvky fungují |
| Rozšíření | Bod 5, výpis typů |
| Výzva | Přidat st.multiselect a st.slider se dvěma úchyty (rozsah) |
Očekávaný výsledek: stránka, kde změna kteréhokoliv prvku hned změní výpis dole.
Tvoje zadání:
Postav obrazovku, kde hráč rozděluje body mezi vlastnosti a nesmí překročit limit.
- Vytvoř konstantu
CELKEM = 30- Přidej tři slidery: síla, obrana, magie
- Spočítej
pouzitoazbyva- Zobraz obojí přes
st.metric- Pomocí
if/elif/elsenapiš zprávu: přesně vyvážená / zbývá X / překročil jsi o X
| Úroveň | Co má zvládnout |
|---|---|
| Minimum | Body 1–3, čísla se počítají správně |
| Rozšíření | Body 4–5, barevné zprávy |
| Výzva | Přidat čtvrtou vlastnost a st.progress, který nikdy nepřeteče (min(x, 1.0)) |
Očekávaný výsledek: posunutím slideru se okamžitě mění zbývající body i barva zprávy.
Tvoje zadání:
Hráč si poskládá jméno hrdiny z částí.
- Přidej
st.selectboxs první částí jména: Ar, Thal, Zor, Mira- Přidej druhý
st.selectboxs koncovkou: -kon, -dor, -ith, -ena- Přidej
st.selectboxs přídomkem: Mocný, Tichý, Ohnivý- Slož celé jméno f-stringem a zobraz ho velkým nadpisem
- Přidej
st.checkbox("Přidat titul"), který před jméno přidá „Lord" nebo „Lady"
| Úroveň | Co má zvládnout |
|---|---|
| Minimum | Body 1–4 |
| Rozšíření | Bod 5 s podmínkou |
| Výzva | Přidat st.radio na volbu Lord/Lady a vypsat délku jména přes len() |
Očekávaný výsledek:
Lord Arkon Ohnivý
Tvoje zadání:
Hráč si vybere zbraň a program spočítá, jestli na ni má.
- Přidej
st.number_input("Tvoje zlato", 0, 999, 120)- Přidej
st.selectboxse třemi zbraněmi- Podle vybrané zbraně nastav cenu pomocí
if/elif/else- Spočítej, kolik zlata zbude po nákupu
- Zobraz zelenou zprávu, když si to hráč může dovolit, jinak červenou
| Úroveň | Co má zvládnout |
|---|---|
| Minimum | Body 1–3 |
| Rozšíření | Body 4–5 |
| Výzva | Přidat st.checkbox("Sleva pro členy cechu"), který cenu sníží o 20 % |
Očekávaný výsledek: změna zlata nebo zbraně okamžitě přepočítá výsledek nákupu.
Tvoje zadání:
Nahraď v
app.pypevně napsané statistiky ovládacími prvky.
- Dej všechny prvky pro tvorbu postavy do
st.sidebar- Jméno přes
text_input, povolání přesselectbox, vzhled přesradio- Tři slidery na sílu, obranu a magii s limitem 30 bodů celkem
- Vypočítej
max_zivoty = 50 + obrana * 5aposkozeni = sila * 2 + magie- V hlavní části zobraz kartu postavy s metrikami a herní pole s vybraným vzhledem
| Úroveň | Co má zvládnout |
|---|---|
| Minimum | Body 1–3 |
| Rozšíření | Body 4–5, statistiky se počítají z voleb |
| Výzva | Přidat color_picker na barvu karty a hlášku, když hráč přesáhne limit bodů |
Očekávaný výsledek: funkční tvorba postavy, kde hráč vidí okamžitý dopad svých voleb.
Přidej do své tvorby postavy alespoň tři nové volby, které mají skutečný vliv na statistiky. Například volba zbraně, která zvýší poškození, nebo brnění, které zvýší životy. Do komentáře napiš, jaké pravidlo jsi vymyslel.
Toto je jedna z možných variant, jak mohl úkol dopadnout. Tvoje řešení se může lišit a to je v pořádku.
Oficiální dokumentace je místo, kam se vyplatí sáhnout, když si chceš ověřit, co který widget vrací, jaké má parametry nebo jak se používá v dalších příkladech. Je v angličtině, ale dobře se v ní hledá podle názvu funkce.
| Co jsme použili | Oficiální dokumentace | Co tam najdeš |
|---|---|---|
st.text_input |
st.text_input |
textové pole, výchozí hodnotu a další parametry |
st.text_area |
st.text_area |
víceřádkový textový vstup |
st.number_input |
st.number_input |
zadávání přesné číselné hodnoty |
st.slider |
st.slider |
posuvník pro čísla i rozsahy |
st.selectbox |
st.selectbox |
výběr jedné možnosti ze seznamu |
st.multiselect |
st.multiselect |
výběr více možností najednou |
st.radio |
st.radio |
přepínač jedné volby |
st.checkbox a st.toggle |
st.checkbox, st.toggle |
booleovské vstupy True / False |
st.select_slider |
st.select_slider |
posuvník nad seznamem možností |
st.color_picker |
st.color_picker |
výběr barvy a hex kód |
st.button |
st.button |
tlačítko a jeho návratovou hodnotu |
| Cvičení | Odkaz | Proč se hodí |
|---|---|---|
| Programování v Pythonu | umimeinformatiku.cz | Vstupy a výstupy programu |
| Rozhodovačka | umimeinformatiku.cz | Rychlé ověření pojmů |
| Tabulky | umimeinformatiku.cz | Práce s hodnotami a jejich vztahy |