Seite 1 von 1

Entry eingabe mit count? durchsuchen

Verfasst: Sonntag 25. Januar 2015, 15:38
von Test
Gude ich möchte einen einfachen Taschenrechner mit grafischer Benutzeroberfläche Programmieren.
Zuerst habe ich es als Konsolenanwendung programmiert, das hat perfekt funktioniert. Aber mit TKinter habe ich das Problem das ich als Fehler angezeigt bekomme: 'Entry' object has no attribute 'count'. Jetzt meine Frage was kann ich an stelle von count benutzen oder kann ich meine Eingabe so umwandeln das ich count benutzen kann?
Danke schonmal im Vorraus!

Python Code:

Code: Alles auswählen

# Einfacher Taschenrechner mit grafischer Benutzeroberfläche
# Rechnung mit nur einem operandten eingeben
#Rechenzeichen +, -, *, /


from tkinter import *

fenster = Tk() #Fenster wird erzeugt
fenster.title("Taschenrechner Version1") #Fenstertitel geändert
fenster.geometry("400x250")#Fenstergröße

labelaufgabe = Label(fenster, text="Bitte Aufgabe eingeben:")# Label für Aufgabe
labelaufgabe.pack()
s = (Entry(fenster)) #Eingabefeld wird erzeugt
s.pack()#Eingabefeld automatisch positionieren
labelergebnis = Label(fenster)#Label zur anzeige des Ergebnisses erzeugen
labelergebnis.pack()

def rechnen():#Funktion zum rechnen
         
         if s.count('+')>0: # Wenn + vorhanden ist wird plus gerechnet
                   wooperand = s.find('+') #Hier wird die stelle an der der Operand steht gesucht
                   operand = s[wooperand]  #Operand wird in die Variable operand geschrieben (Hier +)
                   zahl1 = float(s[:wooperand]) # Alles vor dem Operand ist Zahl 1
                   zahl2 = float(s[wooperand+1:]) # Alles nach dem Operand ist Zahl 2
                   Ergebnis = zahl1+zahl2
         elif s.count('-')>0: # Wenn - vorhanden ist wird Minus gerechnet
                   wooperand = s.find('-')
                   operand = s[wooperand]
                   zahl1 = float(s[:wooperand])
                   zahl2 = float(s[wooperand+1:])
                   Ergebnis = zahl1-zahl2
         elif s.count('*')>0: #Wenn * vorhanden ist wird Minus gerechnet
                   wooperand = s.find('*')
                   operand = s[wooperand]
                   zahl1 = float(s[:wooperand])
                   zahl2 = float(s[wooperand+1:])
                   Ergebnis = zahl1*zahl2
         elif s.count('/')>0:# Wenn / vorhanden ist wird geteilt gerechnet
                   wooperand = s.find('/')
                   operand = s[wooperand]
                   zahl1 = float(s[:wooperand])
                   zahl2 = float(s[wooperand+1:])
                   Ergebnis = zahl1/zahl2   
         else:
                   Ergebnis = "Error"





         labelergebnis.configure(text=(Ergebnis))

     
knopfrechnen = Button(fenster, text="rechnen", command=rechnen)# Button wird erzeugt
knopfrechnen.pack()    
    
    


mainloop()

Re: Entry eingabe mit count? durchsuchen

Verfasst: Dienstag 10. Februar 2015, 14:57
von mkiever
s ist ein Entry Widget, nicht der eingegebene String.
Da muß man erst hineingreifen, um an den String zu kommen.
s.get() liefert den String im Entry Widget s.

Ich hoffe das hilft erstmal weiter,
Matthias

Re: Entry eingabe mit count? durchsuchen

Verfasst: Dienstag 10. Februar 2015, 21:43
von BlackJack
@Test: Um zu testen ob eine Zeichenkette in einer Anderen vorhanden ist würde man den ``in``-Operator verwenden und nicht die `count()`-Methode.

Der Code vermischt die GUI mit der Programmlogik. Das sollte man trennen. Ausserdem ist das vermischen von Hauptprogramm und Funktionsdefinitionen auf Modulebene auch nicht gut. Das Hauptprogramm steckt man üblicherweise in eine `main()`-Funktion und Funktionen sollten ausser auf Konstanten nicht einfach so auf Werte zugreifen die nicht als Argument übergeben wurden. Was bedeutet das man die GUI mit einer Klasse implementieren sollte damit die Rückruffunktion für den Button auch auf das Label zugreifen kann.

Die Rechnung selber enthält wiederholt sehr ähnlichen Code. Das sollte man auch vermeiden. Man könnte die Eingabe mit einem regulären Ausdruck (`re`-Modul) in die Operanden und den Operator zerlegen und den Operator auf eine Funktion abbilden die zwei Operanden entgegennimmt und die entsprechende Operation darauf ausführt. Solche Funktionen gibt es schon fertig im `operators`-Modul.

Re: Entry eingabe mit count? durchsuchen

Verfasst: Dienstag 10. Februar 2015, 22:00
von EyDu
Und noch eine kleine Anmerkung am Rand. Da du einen Taschenrechner programmieren möchtest, solltest du statt Plusrechnen, Minusrechnen, Malrechnen und Teilen vielleicht etwas passendere Namen wählen. Addition, Subtraktion, Multiplikation und Division ;-)