Kalkulačka podruhé - problém s definováním funkcí * / + a - . – Python – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama
Reklama

Kalkulačka podruhé - problém s definováním funkcí  * / + a - . – Python – Fórum – Programujte.comKalkulačka podruhé - problém s definováním funkcí * / + a - . – Python – Fórum – Programujte.com

 

Hledá se programátor! Plat 1 800 € + bonusy (firma Boxmol.com)
vojtano_k0
Návštěvník
23. 9. 2006   #1
-
0
-

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

Nahlásit jako SPAM
IP: ...–
"Jen dvě věci jsou nekonečné. Vesmr a lidská hloupost. Ale tím prvním si nejsem jistý." - Einstein
Reklama
Reklama
Jakub Vojáček
~ Moderátor
0
Grafoman
24. 9. 2006   #2
-
0
-

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:

Nahlásit jako SPAM
IP: ...–
Navštivte server Matematika pro každého
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š
vojtano_k0
Návštěvník
24. 9. 2006   #3
-
0
-

Ještě nejsem na takové úrovni, nechtěl bys mi to prosím trochu vysvětlit?

Nahlásit jako SPAM
IP: ...–
"Jen dvě věci jsou nekonečné. Vesmr a lidská hloupost. Ale tím prvním si nejsem jistý." - Einstein
Jakub Vojáček
~ Moderátor
0
Grafoman
24. 9. 2006   #4
-
0
-

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

Nahlásit jako SPAM
IP: ...–
Navštivte server Matematika pro každého
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š
vojtano_k0
Návštěvník
24. 9. 2006   #5
-
0
-

Díky moc, už chápu :-) Jenom mě zajímá, co tam dělá za 1) to "self" a za 2) __init__ (to sem v životě neviděl)?

Nahlásit jako SPAM
IP: ...–
"Jen dvě věci jsou nekonečné. Vesmr a lidská hloupost. Ale tím prvním si nejsem jistý." - Einstein
geon0
Grafoman
24. 9. 2006   #6
-
0
-

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.

Nahlásit jako SPAM
IP: ...–
geon. volume doprava.
vojtano_k0
Návštěvník
24. 9. 2006   #7
-
0
-

A jak bys to teda řešil ty?

Nahlásit jako SPAM
IP: ...–
"Jen dvě věci jsou nekonečné. Vesmr a lidská hloupost. Ale tím prvním si nejsem jistý." - Einstein
Jakub Vojáček
~ Moderátor
0
Grafoman
24. 9. 2006   #8
-
0
-

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.

Nahlásit jako SPAM
IP: ...–
Navštivte server Matematika pro každého
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š
vojtano_k0
Návštěvník
24. 9. 2006   #9
-
0
-

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? :-)

Nahlásit jako SPAM
IP: ...–
"Jen dvě věci jsou nekonečné. Vesmr a lidská hloupost. Ale tím prvním si nejsem jistý." - Einstein
geon0
Grafoman
24. 9. 2006   #10
-
0
-

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. ;-)

Nahlásit jako SPAM
IP: ...–
geon. volume doprava.
geon0
Grafoman
24. 9. 2006   #11
-
0
-

Blujacker napsal:

tak teda promiňte všichni :((
já se snažil pomoci a vůbec jsem nechtěl někoho určit že něco nechápe.


nic o určení jsem nepsal, bylo to myšleno v dobrém ve všech směrech ..

Nahlásit jako SPAM
IP: ...–
geon. volume doprava.
vojtano_k0
Návštěvník
24. 9. 2006   #12
-
0
-

Nemohl bys mi prosím aspoň napsat, proč se mi v tom mém kódu po kliknutí na = zobrazí i druhý zapsaný číslo?

Nahlásit jako SPAM
IP: ...–
"Jen dvě věci jsou nekonečné. Vesmr a lidská hloupost. Ale tím prvním si nejsem jistý." - Einstein
geon0
Grafoman
24. 9. 2006   #13
-
0
-

protože ho před vložením výsledku nesmažeš ;-)

Nahlásit jako SPAM
IP: ...–
geon. volume doprava.
vojtano_k0
Návštěvník
24. 9. 2006   #14
-
0
-

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()

Nahlásit jako SPAM
IP: ...–
"Jen dvě věci jsou nekonečné. Vesmr a lidská hloupost. Ale tím prvním si nejsem jistý." - Einstein
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 7 hostů

Podobná vlákna

Problém s funkcí foreach — založil MaraIGI

Problém s funkcí strtok() — založil Sprinter

Problém s funkcí strcat() — založil Sprinter

Problem s funkci mkdir(); — založil mORb

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032016 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý