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

py30.png

Zdrojový kod, který bude dále popisován: aplikaceTk.py

http://www.geon.wz.cz/pyczwiki/tk/TkinterAplikace.jpg

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()

http://www.geon.wz.cz/pyczwiki/tk/text.jpg
  • 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()

http://www.geon.wz.cz/pyczwiki/tk/entry.jpg
  • 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()

http://www.geon.wz.cz/pyczwiki/tk/prepinace.jpg
  • 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 .