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í.
Zdrojový kod, který bude dále popisován: aplikaceTk.py
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()
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.
- menuLista je Frame, do kterého budeme vkládat položky menu
- menuSoubor obsahuje více položek, každá má label a command, což je akce, funkce, která se má provést, když na položku klikneme.
- většina položek bude volat stejnou (slepou) funkci hello, některé volají tisk() a 'exit' končí program
- nakonec přidáme menuSoubor a další do menuListy a upravíme okno root: 'root.config(menu=menuLista)'
- 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.
- 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()
- 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č
- 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)
- 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
- 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