Tyto stránky již nejsou udržovány. Obsah je postupně přesouván/aktualizován na adrese chytrosti.marrek.cz.
162/506
Obsah:
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.
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
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
okno
, ale
Radiobutton je umístěn do udělátka transakceRam
transakceVar
. Obě dvě udělátka Radiobutton jsou sice anonymní
(stejně jako titulek), ale spojuje je proměnná transakceVar
a díky hodnotě
této proměnné je možné zjisti jestli je vybrán nákup nebo prodej.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
Radiobutton
y je vytvoříme cyklem.menaVar
.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
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