To, co je na naučse, je jednoduchý program. Zjistí si vstup, něco udělá, vypíše nějaký výstup, konec. Většina programů pro příkazovou řádku je takhle jednoduchá. A jedoduše se to programuje.
Ty se teď ale snažíš o okýnkovou aplikaci. Ty už tak jednoduché nejsou. Okýnková aplikace se spustí, ale nemůže ještě nic dělat, musí počkat, až do ní uživatel začne nějak klikat, aby vůbec věděla co má dělat. A pak je to ještě horší! Nejenže musí začít něco dělat, ale mezitím musí stále reagovat na uživatelovo klikání (jak vypadá zaseklý program, který v tomto selhal, jsi už asi někdy zažil). Takže programování okýnkových aplikací proto není tak jednoduchý jako těch pro příkazovou řádku.
Okýnkový aplikace fungujou tak, že
1) sestavíš nějaký prvotní stav té aplikace - vytvoříš okno, do něj dáš texty (labels), tlačítka, tabulky, obrázky apod.
2) dál už nic - spustíš nějakou funkci, která si běh programu zcela převezme a běží typicky až do konce tvého programu. Tahle funkce obsahuje nekonečnou smyčku (tzv. event loop), která zpracovává všechny vstupy (klikání myší, klávesnice, hodiny, signály, síť apod.) a nějak na ně reaguje.
Jak teda udělat, aby tvoje aplikace po kliknutí na tlačítko něco dělala? To se dělá tak, že tomu tlačítku nastavíš tzv. handler (někdy se tomu říká callback, nebo action apod.), což je funkce, která je zavolána v reakci na kliknutí na tlačítko, a ty v tomhle handleru (v té funkci) můžeš zkusit něco udělat (samozřejmě můžeš volat další funkce, nemusí to být fyzicky v jedné obrovské funkci). Ale nemělo by to trvat moc dlouho, aby program nevypadal zaseklý.
Z toho plyne, že veškerá logika té aplikace, pokud to není inicializace (tvorba toho prvotního stavu), tak bude uvnitř nějakého handleru. Takže je zřejmé, že tvoje if tah_clovek == "Kámen": je na špatném místě - není to uvnitř žádného handleru.
Když se na svůj program podíváš tak, jak se na něj dívá Python - prostě jedeš odshora dolu - tak to nemůže fungovat.
- importuješ něco - ok
- vytvoříš window a lblněco - ok
- vytvoříš moznosti a tah_pocitac - ok
- vytvoříš nějaké funkce, které se jmenují Kamen, Nuzky a Papir - ok. Pozor, ty funkce nejsou spuštěny, jen jsou "zaevidovány", proměnná tah_clovek teď nikde neexistuje.
- vytvoříš nějaké buttony - ok. Těm buttonům dáš odkaz na ty předchozí funkce. To ale ty funkce nespustí. Jen ty buttony budou vědět, že když se na ně někdy v budoucnu klikne, tak teprve potom se spustí tyhle jejich funkce.
- další lblněco
- a teď je tam nějaký if tah_clovek. Co to je? Žádná proměnná tah_clovek přeci neexistuje. Doteď nebyla nijak vytvořena. Python panikaří a končí. Oprávněně.
Zkus svůj program upravit.
To, že ve funkci Kamen (stejně tak Nuzky a Papir) máš porovnání místo přiřazení, a že kdyby to bylo přiřazení, tak by ta proměnná byla lokální jen v té funkci a nebyla by vidět "ven", je jen detail.
PM