prob mit insert und get

Fragen zu Tkinter.
Antworten
Blackfankie
User
Beiträge: 16
Registriert: Sonntag 20. Juli 2003, 00:36

ho,

Sorry, jetzt muß ich euch doch mit meinen Code erschlagen ;-)

Code: Alles auswählen

#!/usr/bin/python

from Tkinter import *



def ausgabe( nr ):
    if (fdivi == 1):
       #global eingabe
       eingabe.insert(END,eingabe.get('1.0',END) / nr) # WARUM GEHT DAS NICHT ????
       
    else:
       if (fmult == 1):
          eingabe.get('1.0',END) * nr
       else:
          if (fdivis == 1):
             eingabe.get('1.0',END) - nr
          else:
             if (fadi == 1):
                eingabe.get('1.0',END) + nr

def fbut7():
    eingabe.insert(END,7)
    ausgabe(7)

def fbut8():
    ausgabe(8)

def fbut9():
    ausgabe(9)

def fbut4():
    ausgabe(4)

def fbut5():
    ausgabe(5)

def fbut6():
    ausgabe(6)

def fbut1():
    ausgabe(1)

def fbut2():
    ausgabe(2)

def fbut3():
    ausgabe(3)
                
       


def dividieren():
    global fdivi
    fdivi= 1
    eingabe.insert(END,"/")

def multiplizieren():
    global fmult
    fmult = 1
    eingabe.insert(END,"*")

def subtrahieren():
    fsubtr=1
    eingabe.insert(END,"-")

def adieren():
    fadi=1
    eingabe.insert(END,"+")
fdivi = 0 # flag division an/aus
fmult = 0 # flag multiplikation an/aus
fsubtr = 0 # flag division an/aus
fadi = 0 # flag adition an/aus

#ergebnis = 0
#print ergebnis
print "Der erste Wert von fdivi ist " + `fdivi`



# GUI-Oberflaeche von Taschenrechner

root = Tk()
root.title("Mein Taschenrechner")

eingabe=Entry(root,width=20)
eingabe.grid(row=2,column=7,columnspan=3)

butmc=Button(root,text="MC",command = lambda :eingabe.insert(END,"MC"))
butmc.grid(row=3,column=6,sticky=NSEW)

butmr=Button(root,text="MR",command = lambda :eingabe.insert(END,"MR"))
butmr.grid(row=3,column=7,sticky=NSEW)

butmmin=Button(root,text="M+",command = lambda :eingabe.insert(END,"M+"))
butmmin.grid(row=3,column=8,sticky=NSEW)

butmpl=Button(root,text="M-",command = lambda :eingabe.insert(END,"M-"))
butmpl.grid(row=3,column=9,sticky=NSEW)

butpro=Button(root,text="%",command = lambda :eingabe.insert(END,"%"))
butpro.grid(row=4,column=6,sticky=NSEW)

but7=Button(root,text="7",command = fbut7 )
but7.grid(row=4,column=7,sticky=NSEW)

but8=Button(root,text="8",command = lambda :eingabe.insert(END,8))
but8.grid(row=4,column=8,sticky=NSEW)

but9=Button(root,text="9",command = lambda :eingabe.insert(END,9))
but9.grid(row=4,column=9,sticky=NSEW)

butdiv=Button(root,text="/",command = dividieren )
butdiv.grid(row=4,column=10,sticky=NSEW)

butce=Button(root,text="CE",command = lambda :eingabe.insert(END,"CE"))
butce.grid(row=5,column=6,sticky=NSEW)

but4=Button(root,text="4",command = lambda :eingabe.insert(END,4))
but4.grid(row=5,column=7,sticky=NSEW)

but5=Button(root,text="5",command = lambda :eingabe.insert(END,5))
but5.grid(row=5,column=8,sticky=NSEW)

but6=Button(root,text="6",command = lambda :eingabe.insert(END,6))
but6.grid(row=5,column=9,sticky=NSEW)

butmul=Button(root,text="*",command = multiplizieren )
butmul.grid(row=5,column=10,sticky=NSEW)

butac=Button(root,text="AC",command = lambda :eingabe.delete(0,END))
butac.grid(row=6,column=6,sticky=NSEW)

but1=Button(root,text="1",command = lambda :eingabe.insert(END,1))
but1.grid(row=6,column=7,sticky=NSEW)

but2=Button(root,text="2",command = lambda :eingabe.insert(END,2))
but2.grid(row=6,column=8,sticky=NSEW)

but3=Button(root,text="3",command = lambda :eingabe.insert(END,3))
but3.grid(row=6,column=9,sticky=NSEW)

butmin=Button(root,text="-",command = subtrahieren )
butmin.grid(row=6,column=10,sticky=NSEW)

but0=Button(root,text="0",command = lambda :eingabe.insert(END,0))
but0.grid(row=7,column=7,sticky=NSEW)

butkom=Button(root,text=".",command = lambda :eingabe.insert(END,"."))
butkom.grid(row=7,column=8,sticky=NSEW)

butistg=Button(root,text="=",command = lambda :eingabe.insert(END,"="))
butistg.grid(row=7,column=9,sticky=NSEW)

butplu=Button(root,text="+",command = adieren )
butplu.grid(row=7,column=10,sticky=NSEW)

#butcli=Button(root,text="C",command = lambda :eingabe.delete(0,END))
#butcli.grid()


###############################################################################

#def ausgabe(nr=1):
#    eingabe.insert(END,nr)
#
root.mainloop()

#print ergebnis
print "Der zweite Wert von fdivi ist " + `fdivi`
Warum geht das nicht ????
Vorerst interesiert mich nur der Button 7.

MFG

Blackfankie
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

Also ich hab einfach mal gestartet und drücke mal auf die "7", da kommt schon das:

Code: Alles auswählen

Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Python22\lib\lib-tk\Tkinter.py", line 1292, in __call__
    return apply(self.func, args)
  File "C:/Dokumente und Einstellungen/Administrator/Eigene Dateien/test5.py", line 22, in fbut7
    ausgabe(7)
  File "C:/Dokumente und Einstellungen/Administrator/Eigene Dateien/test5.py", line 14, in ausgabe
    if (fdivis == 1):
NameError: global name 'fdivis' is not defined
Und dein Fehler:

Code: Alles auswählen

...
eingabe.insert(END,eingabe.get('1.0',END) / nr) # WARUM GEHT DAS NICHT ????
...
eingabe.get('1.0',END) liefert einen String, der nicht durch eine Zahl (nr) teilbar ist teilbar ist. ;) Den musst du vorher entsprechend umwandeln...
Blackfankie
User
Beiträge: 16
Registriert: Sonntag 20. Juli 2003, 00:36

hi,

>eingabe.get('1.0',END) liefert einen String, der nicht durch eine Zahl (nr) teilbar ist teilbar ist. Den musst du vorher entsprechend umwandeln...

Und wie wandelt man einen String in einen init um ???

... weiß blos das man ein init in ein String... so umwandeln kann: `init `

MFG

Blackfankie
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

Das kommt drauf an, was in dem String drin ist. Wenn es nur Zahlen sind, dann geht das problemlos mit int(text) oder long(text). Falls auch ein Komma (Achtung, muss hier ein "." sein) dabei ist, gehts nur noch mit float(text). Und wenn jetzt noch Zeichen wie "=" oder "*" dabei sind, gehts gar nicht (ValueError). DAs würde nahe legen, sich bei jedem dieser Sonderzeichen die Aktion für die nächsten Zahlen zu merken, sie aber nicht in das Entry zu schreiben, damit du immer mit float umrechnen kann.

Falls ich 77 eingebe und auf die "*" drücken sollte, müsste er sich dann das mal bis zur nächsten Aktion merken und intern mit Zwischenergebnissen arbeiten. dann sollte auch der Text im Entry gelöscht werden und nur neue Zahlen angezeigt werden, z.B. eine "2". Dann drücke ich auf das "=" und er holt aus seinem Speicher die 77, multipliziert sie mit der 2 und gibt dir 154 aus.

P.s.: zum wieder eintragen brauchst du einen String, den du mit str(zahl) erhälst.
Antworten