V první lekci o Tkinteru si naprogramujeme lehkou kalkulačku.
Vítejte u tohoto kurzu o grafické knihovně Tkinter. Nebudu začínat od úplných začátků, a proto pro pochopení tohoto kurzu budete muset alespoň trochu umět Python a projít geonovým kurzem o Tkinteru zde na Programujte.
Díly na sebe nebudou navazovat a většinou to bude probíhat tak, že si na začátku určíme nějaký cíl a v průběhu kurzu ho budeme rozebírat a hledat optimální řešení. Dále bych chtěl podotknout, že v ukázkách budu používat Objektově orientované programování.
Jelikož častým dotazem ve fóru bylo, jak si udělat kalkulačku, tak si ukážeme, jak na to. Budeme potřebovat několik udělátek Tkineru, a to: Label, Button, Entry a Frame. Výsledná kalkulačka by mohla vypadat akto:
Pro umisťování jednotlivých udělátek budeme používat manažera pack [ http://www.tkintercz.wz.cz/pack.htm ]. Nejprve musíme vytvořit vstup, do kterého budeme vkládat čísla:
self.vstup=Entry(self.okno)
self.vstup.pack(fill=X)
Z geonova kurzu již víte, že parametr fill určuje, jakým směrem se bude udělátko roztahovat, když bude k dispozici volný prostor. Dále musíme vytvořit tlačítka. Místo vytváření každého tlačítka zvlášť to dáme do cyklu.
tlacitka=[0,1,2,3,4,5,6,7,8,9,"+","−","*","/","."]
for prvek in tlacitka:
tlacitko=Button(self.okno,text=prvek,width=4,height=2)
tlacitko.pack()
Toto nám bohužel vykreslí tlačítka do jedné vysoké řady, což se pochopitelně nehodí. Proto bychom měli vymyslet mechanizmus, jak udělat 4 řádky po 4 tlačítkách. Nejlehčí je podle mě ukládat každá 4 tlačítka do jiného rámu:
for prvek in tlacitka:
if pocet == 4:
ram=Frame(self.okno)
ram.pack(fill=X)
pocet=0
tlacitko=Button(ram,text=prvek,width=4,height=2)
tlacitko.pack(side=LEFT)
pocet=pocet+1
Tohle už funguje správně. Proměnná pocet je tam z toho důvodu, aby Python věděl, kdy udělat nový rám. Schází udělat jedno tlačítko, a to znak rovná se:
Button(ram,text="=",command=self.pocitej,width=4,height=2).pack(side=LEFT)
Takže teď už máme hotové uživatelské prostředí. Nyní musíme udělat funkci self.pocitej.
Pro výpočet výsledku z řetězce existuje funkce eval.
>>> eval("5+5")
10
>>> eval("5−8/8*5**2")
−20
Teď víme, jak zjistit hodnotu řetězce, ale ještě nevíme, jak z udělátka Entry() získat obsah. Pro to existuje funkce get(). Takže teď už můžeme dopsat funkci:
def pocitej(self):
text=self.vstup.get()
vysledek=eval(text)
self.vstup.delete(0,END)
self.vstup.insert(END,vysledek)
No jo, teď náš program umí počítat, ale stále nám nefungují tlačítka. Standardně se příkaz tlačítku přiřazuje prostřednictvím parametru command, ale pro nás bude výhodnější použít metodu bind [ http://www.tkintercz.wz.cz/tkinter-events-and-bindings.htm ]. Tím pádem musíme do cyklu, kde vytváříme tlačítka, přidat řádek:
tlacitko.bind('<1>',self.klik)
Do vstupu se vždy musí vložit obsah toho tlačítka a to probíral už geon ve svých lekcích, ale pro jistotu je to takhle:
def klik(self,udalost):
text=udalost.widget.cget('text')
self.vstup.insert(INSERT,text)
Posledním úkolem je vložit na začátek
from __future__ import division#aby 5/2=2.5
Tímto je naše kalkulačka hotová. Pro ty, kteří by chtěli svoji kalkulačku vylepšit, doporučuji dodělat následující:
- Oznamování chyb při špatném zadání.
- Aby se funkce self.pocitej pouštěla po zmáčknutí Enteru.
- Počítání v různých soustavách.
V dalším díle si řekneme něco o udělátku Canvas.