TextCtrl / Validator

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

Donnerstag 12. April 2007, 08:44

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: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Donnerstag 12. April 2007, 10:35

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

Donnerstag 12. April 2007, 11:49

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: 895
Registriert: Sonntag 6. März 2005, 20:08
Wohnort: Schwabenländle

Donnerstag 12. April 2007, 12:00

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