Na tomto příkladě si ukážeme pár widgetů, udělátek, ze kterých je většinou každé okno vyrobeno. Aplikace v Tkinter jsou doporučovány dělat objektově, přesto tento příklad zůstává u obyčejného řešení.
Aplikace v TK - popis
Zdrojový kod, který bude dále popisován: aplikaceTk.py
Třída Hodnota
class Hodnota: "Trida promennych, ktere se promiskuitne pouzivaji v nekolika funkcích." text=None vstup=None vek=None jazykPy=None jazykC=None jazykX=None
- tato třída slouží jako jakýsi kontejner proměnných, které musí být přístupné ve většině funkcí programu.
- jinými slovy, abychom se nemuseli starat o předávání a vracení proměnných funkcím, případně abychom zabránil naudužívání příkazu global xxx.
- vytvoříme instanci, kterou pak napříč všemi funkcemi můžeme používat: hodnota=Hodnota()
Vše začíná ve start()
def start(): "start vseho" hlavniOkno=Tk() hlavniOkno.title('Aplikace v Tk') # hlavniOkno.iconbitmap('systemova_ikona.ico') frame=Frame(hlavniOkno) frame.pack() nabidka(frame, hlavniOkno) oblastText(frame) vstupniRadek(frame) mezera(10) vek(frame) linka(frame) jazyk(frame)
Vytvoříme hlavniOkno, dáme mu titulek a případně změníme systémovou ikonu.
Frame() vytváří uvnitř hlavního okna rámec, plochu, kontejner pro další widgety. Nic moc jiného neumí, než právě obsahovat další widgety. Jako argument přijímá nadřazené okno a vrací sám sebe = objekt frame. Tento frame pak předáváme dalším widgetům při jejich tvorbě, jako jejich rodiče. Metodou pack() určujeme vlastnosti okna na obrazovce. Zde máme frame.pack(fill=BOTH, expand=YES):
- fill=BOTH značí, aby při změně velikosti nadřazeného okno (hlavniOkno) se tento (aktualni) ramec (widget) roztahoval do všech dvou směrů
- expand=YES je, aby se roztahoval vůbec.
Textová oblast = oblastText() : Text()
- opět si vyrobíme specielní Frame, který také specielně zapakujeme: 'textRamec.pack(fill=BOTH, expand=YES)' - popis tohoto je výše
- Text() je widget, který nám umožňuje do něho psát, mazat, ...
- přidáváme k němu posuvník Scrollbar(), který řádně nakonfigurujeme, aby když s ním budeme posunovat, aby se hýbal text nahoru a dolu.
Vstupní řádek = vstupniRadek() : Entry()
- jednořádková verze widgetu Text()
- vytvoříme si Tkinter proměnnou StringVar(), kterou následně spojíme s obsahem Entry)): 'vstup=Entry(vstupRamec, width=40, textvariable=hodnota.vstup)'. Je to šikovně řešení, kterí funguje oběma směry:
- pokud změníme obsah proměnné hodnota.vstup (např. hodnota.vstup.set("ahoj"), změní se automaticky i text v řádku
- pokud změníme text v řádku, jeho obsah získáme pomocí hodnota.vstup.get()
Přepínače = vek() : Radiobutton()
- do framu vekRamec postupně vkládáme jednotlivé Radiobutton()
- podobně jako v předchozím případě využijeme interní Tk proměnné IntVar(), která uchovává čísla, a svážeme jí s každým přepínačem.
- hodnota value udává, jaké číslo se zapíše do textvariable, když bude zvolen právě ten který přepínač
Zaškrtávátka = jazyk() : Checkbutton()
- každé zaškrtávátko představuje logickou hodnotu Ano - Ne
- využíváme zde opět proměnné IntVar(), kterých však v tomto případě musíme vyrobit tolik, kolik máme widgetů (zaškrtávátek).
- jedno z nich nastavíme jako default: hodnota.jazykPy.set(1)
Oddělovací čára = linka()
- Tkinter nemá takový widget, takže si ho snad jednoduše vyrobíme
- vynecháme mezeru nahoře i dole pomocí obyčejného Framu, který má definovanou výšku
- vlastní čára je také obyčejný frame, který má relief=RAISED s určitou výškou a pozadím
Kontrola proměnných = tisk()
- pro rychlou kontrolu osbahu proměnných je zde funkce tisk(), která je svázána např. s položkou menu Tisk proměnných
- tiskne
- jednak do shellu/dosu: např. print "hodnota.vstup=", hodnota.vstup.get()
- stejný text vkládá i do textové oblasti: hodnota.text.insert(END, t), kde t je řetězec složený ze všech proměnných
Závěr
Po spuštění se program dostane do nekonečné smyčky mainloop(), kde nedělá nic jiného než čeká na uživatelovi povely (stisknutí položek menu, psaní textu, zaškrtávání, ...) a podle toho provádí nadefinované akce (funkce).
Vytvořeno na základě http://www.wag.caltech.edu/home/rpm/python_course/Lecture_6_files/v3_document.htm .