Jakmile jsem vy?e?il probl?m se zapisov?n?m do ??dku zprava navrhl design, vyvstal nov?. Jde o definov?n? funkc? + - * a /. Cht?l bych je nadefinovat tak, ?e kdybych si nap?. zadal do vstupn?ho pole ??slo 73, pot? klikl na /, vymazal by se ??dek, zadal bych ??slo druh?, stiskl = a objevil se mi m?sto druh?ho ??sla v?sledek. Napadlo m? ?e?en? t?m, ?e bych vytvo?il 3 pole: 1. pro zad?n? prvn?ho ??sla, 2. pro druh? ??slo a 3. pro v?sledek. P?ijde mi to ovšem dosti neohraban?... kdyby m?l n?kdo n?vrh, jak teda napsat tu funkci pro + - * a /, nebudu se br?nit :-) P?edem d?ky
Fórum › Python
Kalkulačka podruhé - problém s definováním funkcí * / + a - .
co takle mít řetězec, do kterého by přidávalo, to co uživatel zmáčknul??
from Tkinter import*
class Kalkulacka:
def __init__(self,okno):
self.okno=okno
self.vstup=Entry(justify=RIGHT)
self.vstup.grid(row=0,column=0)
Button(text=1,command=lambda:self.vloz_cislo(1)).grid()
Button(text="+",command=lambda:self.vloz_znamenko("+")).grid()
Button(text="3",command=lambda:self.vloz_cislo("3")).grid()
Button(text="=",command=self.hotovo).grid()
self.priklad=""
def vloz_cislo(self,cislo):
self.vstup.insert(END,cislo)
def vloz_znamenko(self,jake):
self.uloz()
self.priklad=self.priklad+jake
def uloz(self):
cislo=self.vstup.get()
self.vstup.delete(0,END)
self.priklad=self.priklad+cislo
def hotovo(self):
self.uloz()
print "Vysledek: ",eval(self.priklad)
self.priklad=""
okno=Tk()
Kalkulacka(okno)
mainloop()
:ok:
Najdete zde články zabývající se matematikou základních a středních škol a databázi hlavolamů.
Pro vyzkoušení Vaš
je to jednoduch?. Na za??tku m?? n?jak? ?et?zec.
priklad=""
pak zm??kne? tla??tko 1. Do vstupu se vyp??e. Hodnota ?et?zce p??klad se zat?m nem?n?.
Kdy? potom zm??kne? znam?nko "+", tak se zavol? funkce uloz(). V t? se v?e co je v ud?l?tku vstup p?id? do prikladu a vyma?e obsah ud?l?tka:
priklad=priklad+vstup.get()
vstup.delete(0,END)
pak se je?t? mus? dostat to znam?nko do prom?nn?...
priklad=priklad+"+"
#priklad ma hodnotu: 1+
a tak d?le
nakonec kdy? zm??kne? tla??tko "=" tak se nap??e vysledek...
je to jednoduch?, projdi si m?j p?edchoz? p?iklad:toto: a pochop??.
dy?tak se ptej
Najdete zde články zabývající se matematikou základních a středních škol a databázi hlavolamů.
Pro vyzkoušení Vaš
Blujacker napsal:
...
je to jednoduché, projdi si můj předchozí přiklad:toto: a pochopíš.
dyžtak se ptej
Blujacker: Měl bys vědět, že to cos napsal, je sice dobře, ale vůbec to není pro začátečníka jednoduché. A pokud mu říkáš, že to je jednoduché, může se cítit jako že nemá cenu s tím vůbec začínat, když nechápe ani tak "jednoduché" věci.
vojtano: blujacker tímto úplně obešel tvůj původní dotaz - použil tobě asi doposud neznámou funkci "eval", kterou vše velmi, ale skutečně velmi zjednodušil.
Tak teda promiňte všichni :((
Já se snažil pomoci a vůbec jsem nechtěl někoho urážet, že něco nechápe.
Najdete zde články zabývající se matematikou základních a středních škol a databázi hlavolamů.
Pro vyzkoušení Vaš
Takže po menší úvaze jsem na něco přišel. Je to na základě přidávání do řetězce:
# -*- coding: utf-8 -*-.
# autor: vojtech
# first release: 23. 9. 2006
# final release:
# import:
from Tkinter import*
# definicni cast:
# definice zapisovani cislic:
def jednicka_fce():
jedna=1
stavovy_radek.insert(END, jedna)
def dvojka_fce():
dva=2
stavovy_radek.insert(END, dva)
def trojka_fce():
tri=3
stavovy_radek.insert(END,tri)
def ctyrka_fce():
ctyri=4
stavovy_radek.insert(END,ctyri)
def petka_fce():
pet=5
stavovy_radek.insert(END,pet)
def sestka_fce():
sest=6
stavovy_radek.insert(END,sest)
def sedmicka_fce():
sedm=7
stavovy_radek.insert(END,sedm)
def osmicka_fce():
osm=8
stavovy_radek.insert(END,osm)
def devitka_fce():
devet=9
stavovy_radek.insert(END,devet)
def nula_fce():
zero=0
stavovy_radek.insert(END,zero)
# definice pocetnich vykonu:
def vymazat_fce():
stavovy_radek.delete(0,"end")
def plus_fce():
plus_cislo=stavovy_radek.get()
stavovy_radek.priklad=stavovy_radek.priklad+plus_cislo
stavovy_radek.priklad=stavovy_radek.priklad+"+"
stavovy_radek.delete(0,"end")
def rovna_se_fce():
rovna_se_cislo=stavovy_radek.get()
stavovy_radek.priklad=stavovy_radek.priklad+rovna_se_cislo
stavovy_radek.insert(END, eval(stavovy_radek.priklad))
stavovy_radek.priklad=""
# telo programu (viditelna cast):
hlavni_okno=Tk()
hlavni_okno.title("Kalkulačka")
# stavovy radek:
stavovy_radek=Entry(hlavni_okno, width=30, justify=RIGHT)
stavovy_radek.pack(padx=4, pady=4)
# ramecky:
ramecek1=Frame(hlavni_okno)
ramecek1.pack()
ramecek2=Frame(hlavni_okno)
ramecek2.pack()
ramecek3=Frame(hlavni_okno)
ramecek3.pack()
ramecek4=Frame(hlavni_okno)
ramecek4.pack()
# prvni radek buttonu
sedmicka=Button(ramecek1, text='7', width=5, command=sedmicka_fce)
sedmicka.pack(side=LEFT, padx=4, pady=4)
osmicka=Button(ramecek1, text='8', width=5, command=osmicka_fce)
osmicka.pack(side=LEFT, padx=4, pady=4)
devitka=Button(ramecek1, text='9', width=5, command=devitka_fce)
devitka.pack(side=LEFT, padx=4, pady=4)
vymazat=Button(ramecek1, text='Vymazat', width=9, command=vymazat_fce)
vymazat.pack(side=LEFT, padx=4, pady=4)
# druhy radek buttonu
ctyrka=Button(ramecek2, text='4', width=5, command=ctyrka_fce)
ctyrka.pack(side=LEFT, padx=4, pady=4)
petka=Button(ramecek2, text='5', width=5, command=petka_fce)
petka.pack(side=LEFT, padx=4, pady=4)
sestka=Button(ramecek2, text='6', width=5, command=sestka_fce)
sestka.pack(side=LEFT, padx=4, pady=4)
deleno=Button(ramecek2, text='/', width=3)
deleno.pack(side=LEFT, padx=4, pady=4)
krat=Button(ramecek2, text='*', width=3)
krat.pack(side=LEFT, padx=4, pady=4)
# treti radek buttonu
jednicka=Button(ramecek3, text='1', width=5, command=jednicka_fce)
jednicka.pack(side=LEFT, padx=4, pady=4)
dvojka=Button(ramecek3, text='2', width=5, command=dvojka_fce)
dvojka.pack(side=LEFT, padx=4, pady=4)
trojka=Button(ramecek3, text='3', width=5, command=trojka_fce)
trojka.pack(side=LEFT, padx=4, pady=4)
minus=Button(ramecek3, text='-', width=3)
minus.pack(side=LEFT, padx=4, pady=4)
plus=Button(ramecek3, text='+', width=3, command=plus_fce)
plus.pack(side=LEFT, padx=4, pady=4)
# ctvrty radek buttonu
nula=Button(ramecek4, text='0', width=5, command=nula_fce)
nula.pack(side=LEFT, padx=4, pady=4)
rovna_se=Button(ramecek4, text='=', width=5, command=rovna_se_fce)
rovna_se.pack(side=LEFT, padx=4, pady=4)
stavovy_radek.priklad=""
# mainloop
hlavni_okno.mainloop()
Má to ale menší háček. Normálně zadám heslo (např. 4), poté kliknu na +, vymaže se vstupní pole, zadám druhé heslo (např. 2) a kliknu na =. Ale. Místo kýženého výsledku (6) mi to vypíše sice výsledek, ale před něj i druhé zadané číslo, čili 24. Chápete? :-)
J?? No j? bych t? asi zat?m nezasv?coval do taj? t??d (class), ale navedl bych t?, abys to ud?lal pomoc? oby?ejn?ch funkc?. Vysv?tlil ti nejd??v, jak to ud?lat s t?mi funkcemi +-/*, a pak upozornil na mo?nost pou??t p??kaz eval, kter?m absolutn? obejde? nutnost funkce +-*/ vůbec pou??vat. I kdy? je to dobr? program?torsk? cvi?en? na funkce (kdy?bys eval nepou?il), to zas jo.
Taky bych p?estal pou??vat command a nau?il se bind, a hlavn? parametr "udalost", kter? se p?ed?v? a kter? obsahuje nap?. n?zev tla??tka. JE to ut??m ve 23. lekci a pak na tkintercz.wz.cz. Mohl bys tak v?razn? zmen?it po?et funkc?, nap?. pro v?echny ??slice by pak sta?ila funkce jedin?. Ale to by ?lo i s pou?it?m "lambda", jak ukazoval Blujacker.
Tak asi tak. ;-)
Jenom pro zaj?mavost, tady je m? kone?n? ?e?en? (s jedn?m pou?it?m eval, jinak v?echno ostatn? je ve funkc?ch. Vypad? to hrozn?, co?):
# -*- coding: utf-8 -*-.
# autor: vojtech
# first release: 23. 9. 2006
# final release: 24. 9. 2006
# import:
from Tkinter import*
# definicni cast:
# definice zapisovani cislic:
def jednicka_fce():
jedna=1
stavovy_radek.insert(END, jedna)
def dvojka_fce():
dva=2
stavovy_radek.insert(END, dva)
def trojka_fce():
tri=3
stavovy_radek.insert(END,tri)
def ctyrka_fce():
ctyri=4
stavovy_radek.insert(END,ctyri)
def petka_fce():
pet=5
stavovy_radek.insert(END,pet)
def sestka_fce():
sest=6
stavovy_radek.insert(END,sest)
def sedmicka_fce():
sedm=7
stavovy_radek.insert(END,sedm)
def osmicka_fce():
osm=8
stavovy_radek.insert(END,osm)
def devitka_fce():
devet=9
stavovy_radek.insert(END,devet)
def nula_fce():
zero=0
stavovy_radek.insert(END,zero)
# definice pocetnich vykonu:
def vymazat_fce():
stavovy_radek.delete(0,"end")
def plus_fce():
plus_cislo=stavovy_radek.get()
stavovy_radek.priklad=stavovy_radek.priklad+plus_cislo+"+"
stavovy_radek.delete(0,"end")
def rovna_se_fce():
rovna_se_cislo=stavovy_radek.get()
stavovy_radek.priklad=stavovy_radek.priklad+rovna_se_cislo
stavovy_radek.delete(0,"end")
stavovy_radek.insert(END, eval(stavovy_radek.priklad))
stavovy_radek.priklad=""
def minus_fce():
minus_cislo=stavovy_radek.get()
stavovy_radek.priklad=stavovy_radek.priklad+minus_cislo+"-"
stavovy_radek.delete(0,"end")
def krat_fce():
krat_cislo=stavovy_radek.get()
stavovy_radek.priklad=stavovy_radek.priklad+krat_cislo+"*"
stavovy_radek.delete(0,"end")
def deleno_fce():
deleno_cislo=stavovy_radek.get()
stavovy_radek.priklad=deleno_cislo+".0"+"/"
stavovy_radek.delete(0,"end")
def carka_fce():
if stavovy_radek.priklad != "":
stavovy_radek.priklad=stavovy_radek.priklad+"."
else:
stavovy_radek.priklad=stavovy_radek.priklad+"0."
# telo programu (viditelna cast):
hlavni_okno=Tk()
hlavni_okno.title("Kalkula?ka")
# stavovy radek:
stavovy_radek=Entry(hlavni_okno, width=30, justify=RIGHT)
stavovy_radek.pack(padx=4, pady=4)
# ramecky:
ramecek1=Frame(hlavni_okno)
ramecek1.pack()
ramecek2=Frame(hlavni_okno)
ramecek2.pack()
ramecek3=Frame(hlavni_okno)
ramecek3.pack()
ramecek4=Frame(hlavni_okno)
ramecek4.pack()
# prvni radek buttonu
sedmicka=Button(ramecek1, text='7', width=5, command=sedmicka_fce)
sedmicka.pack(side=LEFT, padx=4, pady=4)
osmicka=Button(ramecek1, text='8', width=5, command=osmicka_fce)
osmicka.pack(side=LEFT, padx=4, pady=4)
devitka=Button(ramecek1, text='9', width=5, command=devitka_fce)
devitka.pack(side=LEFT, padx=4, pady=4)
vymazat=Button(ramecek1, text='Vymazat', width=9, command=vymazat_fce)
vymazat.pack(side=LEFT, padx=4, pady=4)
# druhy radek buttonu
ctyrka=Button(ramecek2, text='4', width=5, command=ctyrka_fce)
ctyrka.pack(side=LEFT, padx=4, pady=4)
petka=Button(ramecek2, text='5', width=5, command=petka_fce)
petka.pack(side=LEFT, padx=4, pady=4)
sestka=Button(ramecek2, text='6', width=5, command=sestka_fce)
sestka.pack(side=LEFT, padx=4, pady=4)
deleno=Button(ramecek2, text='/', width=3, command=deleno_fce)
deleno.pack(side=LEFT, padx=4, pady=4)
krat=Button(ramecek2, text='*', width=3, command=krat_fce)
krat.pack(side=LEFT, padx=4, pady=4)
# treti radek buttonu
jednicka=Button(ramecek3, text='1', width=5, command=jednicka_fce)
jednicka.pack(side=LEFT, padx=4, pady=4)
dvojka=Button(ramecek3, text='2', width=5, command=dvojka_fce)
dvojka.pack(side=LEFT, padx=4, pady=4)
trojka=Button(ramecek3, text='3', width=5, command=trojka_fce)
trojka.pack(side=LEFT, padx=4, pady=4)
minus=Button(ramecek3, text='-', width=3, command=minus_fce)
minus.pack(side=LEFT, padx=4, pady=4)
plus=Button(ramecek3, text='+', width=3, command=plus_fce)
plus.pack(side=LEFT, padx=4, pady=4)
# ctvrty radek buttonu
nula=Button(ramecek4, text='0', width=5, command=nula_fce)
nula.pack(side=LEFT, padx=4, pady=4)
rovna_se=Button(ramecek4, text='=', width=5, command=rovna_se_fce)
rovna_se.pack(side=LEFT, padx=4, pady=4)
carka=Button(ramecek4, text=',', width=5, command=carka_fce)
carka.pack(side=LEFT, padx=4, pady=4)
stavovy_radek.priklad=""
# mainloop
hlavni_okno.mainloop()
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Uživatelé prohlížející si toto vlákno
Podobná vlákna
Problém s funkcí — založil mistr jirka
Problém s funkcí — založil mistr jirka
Problém s funkcí imagecopyresampled() — založil lukas
Problem s funkci isdigit() — založil Lukas
Problém s funkcí GetImageSize — založil RePRO
Moderátoři diskuze