162/494

Obsluha směnárny -- příklad

Obsah:

  1. Zadání
  2. Reference
  3. Kurzovní lístek
  4. GUI
  5. Interakce z uživatelem -- události

Zadání

Navrhněte a vytvořte aplikaci pro obsluhu směnárny -- pro nákup i prodej podle aktuálního kurzovního lístku. Kurzovní lístek bude aplikace načítat ze souboru. Aplikace bude při čtení kurzovního lístku i uživatelského vstupu akceptovat jako platný oddělovač desetinných míst jak desetinnou tečku, tak desetinnou čárku.

V případě nákupu zadává směnárna měnu a částku, kterou od zákazníka nakupuje, a výstupem je částka v Kč, kterou zaplatí zákazníkovi. V případě prodeje zadává směnárna měnu a částku, kterou chce zákazník nakoupit a výstupem je částka v Kč, kterou má zákazník zaplatit. Uživatel jako výstup uvidí směněnou částku zaokrouhlenou na celé koruny.

Reference

Kurzovní lístek

Kurzovní lístek se nachází v souboru listek.txt. Na každém řádku je jedna měna. Údaje jsou v pořadí: Kód měny, množství, kurz pro nákup, kurz pro prodej.

AUD   1     19,954    20,746               
DKK   1     3,359     3,491               
EUR   1     25,050    26,032    
HRK   1     3,310     3,446               
JPY   100   19,997    20,790              
CAD   1     18,817    19,562    
HUF   100   8,241     8,583     
NOK   1     3,325     3,457     
PLN   1     6,024     6,269     
RON   1     5,697     5,926     
RUB   100   62,515    65,130    
SEK   1     2,995     3,115     
CHF   1     20,317    21,115 
TRY   1     10,622    11,046    
USD   1     19,234    19,993 
GBP   1     29,030    30,177 

`--> stáhnout

Tento kurzovní lístek je třeba nečíst do paměti a pracovat s ním při výpočtech směnárny. Je vhodné uložit data do přehledné datové struktury, která by odrážela strukturu souboru. Data v poměti mohou vypadat například takto:

meny = [
        ["EUR", 1,    25.050, 26.032 ],
        ["GBP", 1,    29.030, 30.177 ],
        ["USD", 1,    19.234, 19.993 ],
        ["JPY", 100,  19.997, 20.790 ],
       ]

`--> stáhnout

... takže budeme soubor číst po řádcích1, každý řádek rozdělíme pomocí str.split()2, desetinné čárky nahradíme tečkami a převedeme číselné řetězce na float.

#!/usr/bin/python
# -*- coding: utf8 -*-

from Tkinter import *

##################################################
### Definice funkcí 

def nactiListek():
    # načtu soubory
    f=open('listek.txt','r')
    meny=[]
    while 1:
        radek = f.readline()
        if radek == '':
            break
        # řádky, co začínají # ignoruji 
        if radek.strip()[0] == '#': 
            continue
        meny += [ radek.replace(',','.').split() ]
    f.close()
    # převedu řetězce na čísla
    for radek in meny:
        radek[1]=float(radek[1])
        radek[2]=float(radek[2])
        radek[3]=float(radek[3])
    return meny

##################################################
### GUI
okno = Tk()


meny=nactiListek()

##################################################
## Nekonečná smyčka
okno.mainloop()

`--> stáhnout

GUI

Pro umísťování uděláte nám postačí metoda pack. Udělátka v hlavním okně ale seskupíme pomocí udělátka LabelFrame.

Nejprve vytvoříme titulek a výběr mezi nákupem a prodejem.

### Titulek
Label(okno, text=u"Směnárna").pack()

### Nákup prodej
transakceVar =  IntVar()
transakceVar.set(0)

transakceRam = LabelFrame(okno, text="Transakce", padx=5, pady=5)
transakceRam.pack(anchor=W)

Radiobutton(transakceRam,text="Nákup" , variable=transakceVar, value=0).pack(anchor=W)
Radiobutton(transakceRam,text="Prodej", variable=transakceVar, value=1).pack(anchor=W)

`--> stáhnout

Nyní budeme vybírat měnu

### Měna
meny=nactiListek()

menaVar = IntVar()
menaVar.set(0)
menaRam = LabelFrame(okno, text="Měna", padx=5, pady=5)
menaRam.pack(anchor=W)

for n,item in enumerate(meny):
    Radiobutton(menaRam,text=item[0], variable=menaVar, value=n).pack(anchor=W)

`--> stáhnout

A nyní několik udělátek pro zobrazení kurzu, vstupní pole a tlačítko pro odeslání požadavku: Některá vstupní pole jsou jen pro čtení, proto není možné jejich obsah měnit. Pro čtení a zápis do vstupního pole opět používáme tkinterovské proměnné. Při stisku tlačítka vypocetButton se spustí funkce makej.

### Kurz
kurzVar=StringVar()
kurzVar.set('')
mnozstviVar=StringVar()
mnozstviVar.set('')

kurzRam = LabelFrame(okno, text="Kurz", padx=5, pady=5)
kurzRam.pack(anchor=W)
mnozstviEdit = Entry(kurzRam, state='readonly', textvariable=mnozstviVar)
mnozstviEdit.pack(anchor=W)
kurzEdit = Entry(kurzRam, state='readonly', textvariable=kurzVar)
kurzEdit.pack(anchor=W)

### Výpočet
vstupVar=StringVar()
vstupVar.set('')
vystupVar=StringVar()
vystupVar.set('')

vypocetRam = LabelFrame(okno, text="Výpočet", padx=5, pady=5)
vypocetRam.pack(anchor=W)

vstupEdit = Entry(vypocetRam, textvariable=vstupVar)
vstupEdit.pack(anchor=W)

vypocetButton= Button(vypocetRam,text="Výpočet", command=makej)
vypocetButton.pack(anchor=E)

vystupEdit = Entry(vypocetRam, state='readonly', textvariable=vystupVar)
vystupEdit.pack(anchor=W)

`--> stáhnout

Interakce z uživatelem -- události

Zajistíme, aby při překliknutí nákup/prodej a při výběru měny byl v poli mnozstviEdit a kurzEdit ten správný kurz. Zajistíme to sledování zápisu do tkinterovských proměnných menaVar a transakceVar.

Funkce kurzUpdate nastavuje globální proměnné, které potom funkce makej čte.

mnozstvi = 1
kurz = 1

### obsluha tlačítka
def makej():
    global mnozstvi
    global kurz
    vstup =  float(vstupVar.get())
    vystup= kurz/mnozstvi * vstup
    vystupVar.set(str(vystup))

### obsluha radiotlačítek
def kurzUpdate(*args):
    global mnozstvi
    global kurz
    mnozstviVar.set(str(meny[menaVar.get()][1]))
    count=meny[menaVar.get()][1]
    if transakceVar.get()==0:
        kurzVar.set(str(meny[menaVar.get()][2]))
        kurz=meny[menaVar.get()][2]
    else:
        kurzVar.set(str(meny[menaVar.get()][3]))
        kurz=meny[menaVar.get()][3]


### události
transakceVar.trace("w",kurzUpdate)
menaVar.trace("w",kurzUpdate)
okno.bind('<Map>', kurzUpdate) # při startu aplikace

`--> stáhnout

| navigace |

Licence Creative Commons Valid XHTML 1.0 Strict Valid CSS! Antispam.er.cz Blog: Tlapicka.net