Qt: Eingabe (Zahlenwert) prüfen

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
JFHunter
User
Beiträge: 8
Registriert: Montag 11. Mai 2015, 18:38
Wohnort: München

Hallo Forum,

ich lerne gerade im Selbststudium Python (2.7 und 3.4) und seit etwa einer Woche das Entwickeln von GUIs u.a. mit Qt4. Ich versuche gerade zu meinem ersten Programm für die Kommandozeile eine Qt Oberfläche zu basteln. Hierfür soll der Benutzer in drei Feldern Zahlenwerte eingeben die zuerst geprüft und dann einer Berechnung zugeführt werden. Momentan hänge ich an der Werteprüfung. Hierzu hab ich ein Minimalbeispiel erstellt mit dem sich das Problem auch reproduzieren lässt.

Code: Alles auswählen

    def createConnects(self):
        self.buttonTextAktualisieren.clicked.connect(self.umwandeln)
        
    def umwandeln(self):
        try:
            self.eingabe = unicode(self.editText.text())
            #Ausgabe zur Kontrolle
            print(type(self.eingabe), self.eingabe)
            
            self.fuss = float(self.eingabe)
            #Ausgabe zur Kontrolle
            print(type(self.fuss), self.fuss)
            
            #Fallunterscheidung
            if self.fuss > 0:
                self.textausgabe.setText(u"UK = " + str(self.fuss) + " m ü. GOK")
            elif self.fuss == 0:
                self.textausgabe.append(u"UK = GOK")
            else:
                self.textausgabe.append(u"UK = " + str(self.fuss) + " m u. GOK")
        except:
            self.textausgabe.append(u"UK: Bitte eine Zahl eingeben!")
Das Merkwürdige hierbei ist, wenn ich eine positive Zahl in das Eingabefeld eintippe, erscheint der except Text. Wird aber die Zahl 0 oder eine negative Zahl eingegeben, erscheint der zugehörige Text. Um die Konvertierung von String in Float zu prüfen hab ich jeweils zwei Kontrollausgabe für die Konsole ergänzt. Aber hier sieht alles in meinen Augen normal aus.

Bei meinem eigentlichen Programm hab ich für die anderen zwei Eingabefelder den gleichen Konstrukt für die Werteprüfung. Diese funktionieren einwandfrei. Nur bei dieser Abfrage will es nicht so richtig klappen. Selbst beim Minimalbeispiel s.o. klappt es nicht richtig.

Kann mir hierzu bitte jemand helfen was hier nicht stimmt?

Vielen Dank schon mal vorab!

JFHunter

OS: Linux Mint 17.1 - Mate
Beide Skripte verwende ich Python 2.7
Wenn das komplette Skript vom Minimalbeispiel oder vom eigentlichen Programm gewünscht ist, ergänze ich das gerne.
Sirius3
User
Beiträge: 17745
Registriert: Sonntag 21. Oktober 2012, 17:20

@ JFHunter: das ist ein schönes Beispiel dafür, warum man niemals ein nacktes except benutzen sollte. Was willst Du mit dem except tatsächlich abfangen? Es gibt zwei Grundregeln: nur den Fehler abfangen, den man auch erwartet und nur den Code in den try-Block nehmen der den Fehler verursachen kann.
Wenn Du beides befolgst, bist Du der Lösung des Problems schon deutlich näher.

Weder eingabe noch fluss sollten wohl Attribute des Objekt sein, sondern ganz normale lokale Variablen. Für String-Formatierungen kennen Strings format.
JFHunter
User
Beiträge: 8
Registriert: Montag 11. Mai 2015, 18:38
Wohnort: München

Hallo Sirius3,

ich will mit dem except die Eingabe von Zeichenketten abfangen, wenn also keine Zahl eingegeben wird.
Wenn ich dich richtig verstanden habe soll ich nur den Schritt der Umwandlung von String -> Float mit try - except abfangen? Das Probier ich mal.
Was mich eben wundert ist wieso die Prüfung bei 0 und negativen Zahlen funktioniert aber bei Positiven nicht?!
Sirius3
User
Beiträge: 17745
Registriert: Sonntag 21. Oktober 2012, 17:20

@JFHunter: welche Exception kann es beim Umwandeln von String nach Float geben?
BlackJack

@JFHunter: Wenn Du Dir die Ausnahme die da ausgelöst wird mal anschauen würdest, wüsstest Du was nicht funktioniert. Zumindest wärst Du dem Fehler im Programm dann einen guten Schritt näher.
JFHunter
User
Beiträge: 8
Registriert: Montag 11. Mai 2015, 18:38
Wohnort: München

@Sirius3: Ein ValueError. Ich hab mein Beispiel nun soweit angepasst damit ich bei der Umwandlung der Eingabe in ein Float. Falls dies scheitert kommt except ValueError ...

@BlackJack: Ich hab mir die Fehlermeldungen schon angeschaut, bin aber trotzdem noch nicht auf die Richtige Lösung gekommen, sonst hätte ich hier nicht gefragt ;-). Jetzt erhalte ich folgende Meldung:
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 3: ordinal not in range(128)
Dass das ganze etwas mit der Codierung zu tun haben könnte hab ich auch schon herausgefunden, aber eben noch keine passende Lösung (oder vielleicht auch nur nicht als Solche erkannt). Muss ich den Ausgabestring als Unicode umwandeln oder welche Codierung muss der String zur Ausgabe sein?
BlackJack

@JFHunter: Die Zeichenkette für die GUI muss eine `unicode`-Zeichenkette sein und Du versuchst da einen Teil(byte)string hinzuzufügen der etwas ausserhalb von ASCII enthält. Zeile 16.
Sirius3
User
Beiträge: 17745
Registriert: Sonntag 21. Oktober 2012, 17:20

@JFHunter: dass Dir der Fehler schon bekannt war, ging nicht aus Deiner bisherigen Posts hervor. Wichtig ist ja auch noch, in welcher Zeile der Fehler auftritt. Dort versuchst Du einen Byte-String in einen Unicode-String umzuwandeln. Das geht in einem Fall gut, weil da keine Umlaute im String vorkommen, im anderen Fall eben nicht.
JFHunter
User
Beiträge: 8
Registriert: Montag 11. Mai 2015, 18:38
Wohnort: München

Ahh, jetzt hab ich es gefunden :-) Nicht die umgewandelte Zahl war das Problem, sondern der String "m ü. GOK" dahinter, der hätte auch Unicode sein müssen.

Vielen Dank BlackJack und Sirius3!
BlackJack

@JFHunter: Es gibt für die Eingabe von Gleitkommazahlen übrigens auch ein spezialisierteres Widget: `QDoubleSpinBox`.
EmaNymton
User
Beiträge: 174
Registriert: Sonntag 30. Mai 2010, 14:07

Alternativ könntest du auch ein QValidator benutzen, in diesem Fall einen QDoubleValidator, da dort nur noch Floats-Eingaben im LineEdit möglich sind:
http://pyqt.sourceforge.net/Docs/PyQt4/ ... ml#details
Antworten