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.
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.
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
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.
Dankeschön
