Sonntag, 22. Januar 2012

Die Untiefen des QIntValidators...

... oder auch: Wenn der Computer weiter denkt als der Mensch.

Für den Beitrag hier im Blog To GUI or not to GUI hat ich für das Qt4 / PySide eigentlich eine andere, kürzere Variante im Kopf.  Dabei sollte der try... except... Block wegfallen, weil für das Eingabefeld ein QIntValidator zum Einsatz kommen sollte. Dieser prüft, wie der Name schon vermuten lässt, ob eine Eingabe eine ganze Zahl ist bzw. Unterdrückt direkt die Eingabe von Buchstaben, Zeichen etc.

So weit, so gut. Hat aber nicht so funktioniert, wie ich dachte. Das zeigt auch das folgende, kleine Beispielprogramm:

#!/usr/bin/env python
# ~*~ coding: utf-8 ~*~

import sys

from PySide import QtGui

class MyClass(QtGui.QDialog):
    def __init__(self,parent=None):
        super(MyClass, self).__init__(parent)
        self.setWindowTitle('QIntValidator Test')
        layout = QtGui.QVBoxLayout()
        self.eingabe = QtGui.QLineEdit()
        self.eingabe_valid = QtGui.QIntValidator(0,1000,self)
        self.eingabe.setValidator(self.eingabe_valid)
        layout.addWidget(self.eingabe)
        self.button = QtGui.QPushButton(u'Echo')
        layout.addWidget(self.button)
        self.label = QtGui.QLabel(u'Echo...')
        layout.addWidget(self.label)
        self.setLayout(layout)
        self.button.clicked.connect(self.echo)

    def echo(self):
        wert = int(self.eingabe.text())
        return self.label.setText(unicode(wert))

if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)
    my_class = MyClass()
    my_class.show()
    sys.exit(app.exec_())

Dieses gibt einfach die Eingabe (welches eine ganze Zahl sein muss) wieder. Wird nun aber z.B. "1.1" oder "1,1" eingegeben, so wird - zumindest auf meinem System (Ubuntu 11.10 mit deutscher Spracheinstellung) - "11" zurück geliefert. Punkt bzw. Komma werden also entfernt.

Leicht verwirrt habe ich dann im deutschen Python-Forum nach Rat gefragt und der Nutzer "lunar" wusste auch, warum dieses Verhalten so ist. Die Langversion kann man im verlinkten Thread nachlesen, die Kurzfassung ist: Aufgrund der Spracheinstellung werden Punkt und Komma als gültige 1000er-Trennzeichen akzeptiert. Tauchen diese aber an der falschen Stelle auf (wie z.B. bei 1.1), dann wird es einfach ignoriert bzw. entfernt. Ergo: It's not a bug, it's a feature! Da muss man aber erst Mal drauf kommen... (zu Mal es in der PySide Doku nur sehr kurz erwähnt ist).

Wer einen "echten" Validator braucht, welcher wirklich nur die Ziffern von 0 bis 9 als Eingabe akzeptiert, der findet im oben genannten Thread direkt auch noch die passende Lösung, ebenfalls vom Nutzer lunar.

Keine Kommentare:

Kommentar veröffentlichen