× Aktuálně z oboru

Programátoři po celém světě dnes slaví Den programátorů [ clanek/2018091300-programatori-po-celem-svete-dnes-slavi-den-programatoru/ ]
Celá zprávička [ clanek/2018091300-programatori-po-celem-svete-dnes-slavi-den-programatoru/ ]

Tkinter - Kalkulačka

[ http://programujte.com/profil/1835-jakub-vojacek/ ]Google [ ?rel=author ]       [ http://programujte.com/profil/118-zdenek-lehocky/ ]Google [ ?rel=author ]       16. 6. 2007       28 698×

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.


Článek stažen z webu Programujte.com [ http://programujte.com/clanek/2007030104-tkinter-kalkulacka/ ].