Entry eingabe mit count? durchsuchen

Fragen zu Tkinter.
Antworten
Test
User
Beiträge: 1
Registriert: Sonntag 25. Januar 2015, 15:20

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()
Zuletzt geändert von Anonymous am Sonntag 25. Januar 2015, 15:54, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Code-Tags gesetzt.
mkiever
User
Beiträge: 19
Registriert: Mittwoch 4. März 2009, 18:06
Wohnort: Braunschweig

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
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.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

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 ;-)
Das Leben ist wie ein Tennisball.
Antworten