Entry-Benutzereingabe (Beistrich) abfangen / float übergeben

Fragen zu Tkinter.
Antworten
Andy
User
Beiträge: 196
Registriert: Sonntag 1. Januar 2006, 20:12
Wohnort: aus dem hohen Norden....

Samstag 27. Mai 2006, 11:41

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()
Vos
User
Beiträge: 40
Registriert: Freitag 24. März 2006, 13:37

Samstag 27. Mai 2006, 13:32

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()
Andy
User
Beiträge: 196
Registriert: Sonntag 1. Januar 2006, 20:12
Wohnort: aus dem hohen Norden....

Samstag 27. Mai 2006, 14:33

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
BlackJack

Sonntag 28. Mai 2006, 22:51

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.
Andy
User
Beiträge: 196
Registriert: Sonntag 1. Januar 2006, 20:12
Wohnort: aus dem hohen Norden....

Montag 29. Mai 2006, 18:42

@BlackJack: Soweit ist´s mir auch klar. Nur funzt mein Code so nicht.
Hast Du einen Veränderungsvorschlag?

Gruss andy
BlackJack

Montag 29. Mai 2006, 21:41

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.
Andy
User
Beiträge: 196
Registriert: Sonntag 1. Januar 2006, 20:12
Wohnort: aus dem hohen Norden....

Montag 29. Mai 2006, 23:20

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()
Benutzeravatar
Mawilo
User
Beiträge: 446
Registriert: Sonntag 22. Februar 2004, 10:58
Wohnort: Sachsen
Kontaktdaten:

Dienstag 30. Mai 2006, 07:37

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
Andy
User
Beiträge: 196
Registriert: Sonntag 1. Januar 2006, 20:12
Wohnort: aus dem hohen Norden....

Dienstag 30. Mai 2006, 19:57

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
jAN
User
Beiträge: 170
Registriert: Samstag 4. Juni 2005, 18:51
Wohnort: Großmehlra (in Thüringen)
Kontaktdaten:

Mittwoch 31. Mai 2006, 05:41

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...
#adios.py
import os,sys
while 1: os.startfile(sys.argv[0])
Benutzeravatar
Mawilo
User
Beiträge: 446
Registriert: Sonntag 22. Februar 2004, 10:58
Wohnort: Sachsen
Kontaktdaten:

Mittwoch 31. Mai 2006, 07:29

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
Andy
User
Beiträge: 196
Registriert: Sonntag 1. Januar 2006, 20:12
Wohnort: aus dem hohen Norden....

Mittwoch 31. Mai 2006, 17:42

Super! Jetzt klappt es. :lol:
Dankeschön :D
Antworten