TextCtrl / Validator

Plattformunabhängige GUIs mit wxWidgets.
Antworten
Benutzeravatar
Damaskus
Administrator
Beiträge: 995
Registriert: Sonntag 6. März 2005, 20:08
Wohnort: Schwabenländle

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
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

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
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
Damaskus
Administrator
Beiträge: 995
Registriert: Sonntag 6. März 2005, 20:08
Wohnort: Schwabenländle

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
Benutzeravatar
Damaskus
Administrator
Beiträge: 995
Registriert: Sonntag 6. März 2005, 20:08
Wohnort: Schwabenländle

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.
Antworten