Seite 1 von 1

TextCtrl / Validator

Verfasst: Donnerstag 12. April 2007, 08:44
von Damaskus
Moin,
ich hab ein TextCtrl mit einem Validator ausgestattet der mir nur Alphanumerische Zeichen zulassen soll. Außerdem ist das TextCtrl auf 8 Zeichen beschränkt.

Wenn ich mit den Pfeiltasten innerhalb des TextCtrls navigieren will kommt folgende Fehlermeldung:

Code: Alles auswählen

ValueError: chr() arg not in range(256)

Code: Alles auswählen

        nummer_entry = wx.TextCtrl(parent=panel, id=701, validator=NummerValidator())
        nummer_entry.SetMaxLength(8)



class NummerValidator(wx.PyValidator):
    def __init__(self):
        wx.PyValidator.__init__(self)
        self.Bind(wx.EVT_CHAR, self.OnChar)
    
    def Clone(self):
        return NummerValidator()
    
    def Validate(self, win):
        return True
    
    def TransferToWindow(self):
        return True
    
    def TransferFromWindow(self):
        return True
    
    def OnChar(self, evt):
        key = chr(evt.GetKeyCode())
        if key in string.letters:
            return
        evt.Skip()
Wie umgehe ich den Fehler richtig?

Danke für eure Hilfe.
Gruß
Damaskus

Re: TextCtrl / Validator

Verfasst: Donnerstag 12. April 2007, 10:35
von gerold
Damaskus hat geschrieben:Wie umgehe ich den Fehler richtig?
Hi Damaskus!

Vielleicht so:

Code: Alles auswählen

    def OnChar(self, evt):
        keycode = evt.GetKeyCode()
        if keycode < 256:
            if chr(keycode) in string.digits:
                evt.Skip()
        else:
            evt.Skip()
In einigen Anwendungsfällen, könntest aber auch "from wx.lib.masked import NumCtrl" verwenden. Wird in der wxPython-Demo demonstriert.

mfg
Gerold
:-)

Re: TextCtrl / Validator

Verfasst: Donnerstag 12. April 2007, 11:49
von Damaskus
gerold hat geschrieben: Vielleicht so:

Code: Alles auswählen

    def OnChar(self, evt):
        keycode = evt.GetKeyCode()
        if keycode < 256:
            if chr(keycode) in string.digits:
                evt.Skip()
        else:
            evt.Skip()
Also das funktioniert beinahe, jetzt kann ich zwar innerhalb des TextCtrl navigieren, aber entfernen geht nicht mehr...

Na ich werd mal weiter probieren.

Gruß
Damaskus

Verfasst: Donnerstag 12. April 2007, 12:00
von Damaskus
Ich habs jetzt mal noch ganz einfach erweitert...
Jetzt funktioniert es zwar, aber ob das so richtig ist... ???
Einfach noch die "Asci" (???) Zeichen in die if abfrage eingebaut.
Ist wohl aber eher unsauber... zumindest gefällts mir nicht.

Code: Alles auswählen

    def OnChar(self, evt):
        keycode = evt.GetKeyCode()
        print keycode
        if keycode < 256:
            print chr(keycode)
            if chr(keycode) in string.digits:
                evt.Skip()
            if chr(keycode) == "":
                evt.Skip()
            if chr(keycode) == "":
                evt.Skip()
        else:
            evt.Skip()
Gruß
Damaskus

EDIT:
Ich hab jetzt einfach die entsprechenden KeyCode (8, 127) in die if abfrage eingesetzt.