Seite 1 von 1

Entry-Benutzereingabe (Beistrich) abfangen / float übergeben

Verfasst: Samstag 27. Mai 2006, 11:41
von Andy
Hallo Leute,

vor einigen Monaten habt ihr mein Problem mit der Benutzereingabe eines Beistrichs über raw_input lösen können. :D
http://www.python-forum.de/post-28275.html#28275

Code: Alles auswählen

def input_german_money_value(prompt): 
    user_input = raw_input(prompt) 
    user_input = user_input.replace('.', '').replace(',', '.') 
    return float(user_input)
Nun meine Frage:
Ich bin bereits zu Tkinter übergegangen und habe ein fertiges Programm.
Wie kann ich nun die Entry-Feldeingabe (mit Beistrich) so abfangen, dass
Python diese als float() erkennt :?:

Code: Alles auswählen

self.neubauwert=StringVar()
Entry(self.fenster, textvariable=self.neubauwert,
      width=13).pack()

Verfasst: Samstag 27. Mai 2006, 13:32
von Vos
Verstehe nich so genau was du meinst?

du hast ein entry:

Code: Alles auswählen

fEntry = Frame(F, border="1")
eSerial = Entry(fEntry)
eSerial.pack(side="left", expand="true")
fEntry.pack(side="top", expand="true")
und willst den inhalt?

Code: Alles auswählen

IrgendeineVariable=eSerial.get()
print IrgendeineVariable
grüße

<edit>

ihr mal ein "beispielprogi"

Code: Alles auswählen

from Tkinter import*
top = Tk()
top.wm_geometry("250x100")
top.title("Serial")

F = Frame(top)
F.pack(expand="true")

## Das entry
fEntry = Frame(F, border="1")
eSerial = Entry(fEntry)
eSerial.pack(side="left", expand="true")
fEntry.pack(side="top", expand="true")

def evOkay():
	IrgendeineVariable=eSerial.get()
	print IrgendeineVariable

##Button der das "herausholen" auslöst!
fButtons = Frame(F, border=1)
bOkay = Button(fButtons, text="Okay",width=8, height=1, command=evOkay)
bOkay.pack(side="top", padx=6, pady=6)
fButtons.pack(side="top", expand="true")

F.mainloop()

Verfasst: Samstag 27. Mai 2006, 14:33
von Andy
Hallo Vos,

nicht ganz das was ich suche.
Es scheint nach Deinem Code nicht sonderlich schwer zu sein, irgendeine
Benutzereingabe abzufangen. :shock:

Mein Problem ist jedoch, ich möchte mit der Benutzereingabe, sagen wir
350589,48 weiterarbeiten.
Also so wie unten im Code, die Benutzereingabe als float verwenden und halt noch eine Rechnung durchführen und auszugeben.

Code: Alles auswählen

from Tkinter import *
#Funktion um die Benutzereingabe "," abzufangen:
def input_german_money_value(prompt):
    user_input = raw_input(prompt) 
    user_input = user_input.replace('.', '').replace(',', '.') 
    return float(user_input)

class Dezimalrechnen:
    def __init__(self):
        self.tk = Tk()
        self.wert = input_german_money_value()
        self.variable = 10.52
        self.ausgabe = StringVar()
        Label(self.tk, text='Eingabe:', width=20, height=4).pack()
        Entry(self.tk, textvariable = self.wert, width=10, relief='sunken',
              borderwidth=2).pack()
        Button(self.tk, text='Berechnen',
               width =10, height= 1,
               command=self.berechnen).pack()
        Label(self.tk,font=('Arial', 12), fg='red',
              width=20, height=2,
              textvariable=self.ausgabe).pack()
        self.tk.mainloop()
#Benutzereingabe als float berechnen:
    def berechnen(self):
        wert=self.wert.get()
        rechnung = float(wert) / self.variable
        ergebnis = ("%.2f" % rechnung)
        self.ausgabe.set(ergebnis)
        
dezimalrechnen = Dezimalrechnen()

Schon mal Danke im Voraus.
Gruss andy

Verfasst: Sonntag 28. Mai 2006, 22:51
von BlackJack
Hier bekommst Du Deine Zeichenkette, in diesem Fall in `wert` eben nicht von `raw_input()` sondern aus einem Eingabefeld von Tkinter. Das Prinzip bleibt das gleiche.

Verfasst: Montag 29. Mai 2006, 18:42
von Andy
@BlackJack: Soweit ist´s mir auch klar. Nur funzt mein Code so nicht.
Hast Du einen Veränderungsvorschlag?

Gruss andy

Verfasst: Montag 29. Mai 2006, 21:41
von BlackJack
Von `raw_input()` bekommst Du eine Zeichenkette und aus dem Entry bekommst Du eine Zeichenkette. Mit der von `raw_input()` machst Du etwas was Du mit `wert` nicht machst.

Verfasst: Montag 29. Mai 2006, 23:20
von Andy
Ok, raw_input ist hier also fehl am Platze. Da ja die Zeichenkette aus´n Entry kommt.

Ich hab jetzt mein Programm mal abgeändert. Erhalte jedoch immer noch Fehlermeldungen:

Code: Alles auswählen

Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Python24\lib\lib-tk\Tkinter.py", line 1345, in __call__
    return self.func(*args)
  File "C:\Dokumente und Einstellungen\Richy Rich\Desktop\test.pyw", line 43, in evOkay
    user_input = user_input.replace('.', '').replace(',', '.')
AttributeError: Entry instance has no attribute 'replace'

Ich weiß nicht mehr, wo ich noch was abändern muss. Gut anscheined sagt die Fehlermldg. ja dass das Entry nicht weiß was replace ist.
Aber kenn mich auch noch nicht so mit Schleifen u. Tkinter aus.
Hier mein abgeänderter Code:

Code: Alles auswählen

# -*- coding: cp1252 -*-
from Tkinter import *
#Funktion um die Benutzereingabe "," abzufangen:

class Dezimalrechnen:
    def __init__(self):
        self.tk = Tk()
        
        self.variable = 10.52
        self.ausgabe = StringVar()
        self.F = Frame(self.tk)
        self.F.pack(expand="true") 

        Label(self.F, text='Eingabe:', width=10, height=2).pack()

        self.fEntry = Frame(self.F, border="1")
        self.eSerial = Entry(self.fEntry)
        self.eSerial.pack(side="left", expand="true")
        self.fEntry.pack(side="top", expand="true") 

        # -brauch ich nicht - Entry(self.tk, input_german_money_value(), width=10, relief='sunken',
              #borderwidth=2).pack()
        
        ##Button der das "herausholen" auslöst!
        self.fButtons = Frame(self.F, border=1)
        self.bOkay = Button(self.fButtons, text="Berechnen",width=8, height=1,
                            command=self.evOkay)
        self.bOkay.pack(side="top", padx=6, pady=6)
        self.fButtons.pack(side="top", expand="true") 

        # -brauch ich auch nicht - Button(self.tk, text='Berechnen',
              # width =10, height= 1,
              # command=self.berechnen).pack()
        Label(self.F, font=('Arial', 12), fg='red',
              width=20, height=4,
              textvariable=self.ausgabe).pack()
        self.tk.mainloop()
        
#Benutzereingabe als float berechnen:
    def evOkay(self):
        user_input = self.eSerial
        while user_input == self.eSerial:
            user_input = user_input.replace('.', '').replace(',', '.')
            return float(user_input)
        rechnung = self.evOkay/self.variable
        ergebnis = ("%.2f" % rechnung)
        self.ausgabe.set(ergebnis)
        
dezimalrechnen = Dezimalrechnen()

Verfasst: Dienstag 30. Mai 2006, 07:37
von Mawilo
Hallo,

mit dem Eintrag
user_input = self.eSerial
gibst du das Entry weiter und nicht den Inhalt. Du musst die Werte eines Entrys mit

Code: Alles auswählen

user_input = self.eSerial.get() 
auslesen.

Stephan

Verfasst: Dienstag 30. Mai 2006, 19:57
von Andy
Hi Stephan,

aber wenn ich´s so mache, erhalte ich zwar keine Fehlermeldung, doch beim Klick auf dem Button passiert gar nichts.

Code: Alles auswählen

def evOkay(self):
        user_input = self.eSerial.get()
        while user_input == self.eSerial.get():
            user_input = user_input.replace('.', '').replace(',', '.')
            return float(user_input) #print würde hier funzen!!
        rechnung = self.evOkay()/self.variable
        ergebnis = ("%.2f" % rechnung)
        self.ausgabe.set(ergebnis)
Unter den Button soll natürlich das Ergebnis erscheinen wie hier angeführt

Code: Alles auswählen

Label(self.tk, font=('Arial', 12), fg='red',
              width=15, height=2,
              textvariable=self.ausgabe).pack()
        self.tk.mainloop()
Könntest Du es bitte mal testen... wär auch nett wenn Du den Code umschreiben würdest.
Danke andy

Verfasst: Mittwoch 31. Mai 2006, 05:41
von jAN
Das Programm hängt in der schleife... mit return gehst du ganz aus der funktion raus und gibst nur float(user_input) zurück...
schau mla in die konsole wenn du auf den button klickst...

Verfasst: Mittwoch 31. Mai 2006, 07:29
von Mawilo
Hallo Andy,

in der Funktion waren noch ein paar Fehler.
ich habe mal die Funktion etwas überarbeitet.

Code: Alles auswählen

def evOkay(self): 
    user_input = self.eSerial.get().replace('.', '').replace(',', '.') 
    rechnung = float(user_input)/self.variable 
    ergebnis = ("%.2f" % rechnung) 
    self.ausgabe.set(ergebnis)
Stephan

Verfasst: Mittwoch 31. Mai 2006, 17:42
von Andy
Super! Jetzt klappt es. :lol:
Dankeschön :D