"Validator" für TextCtrl

Plattformunabhängige GUIs mit wxWidgets.
Antworten
laggflor
User
Beiträge: 8
Registriert: Mittwoch 17. September 2008, 21:32

Hi,

Ich möchte, dass während der Eingabe in ein TextCtrl geprüft wird, ob die eingegebenen Daten erlaubt sind. Als einfaches Beispiel sollen in eimen TextCtrl nur Ziffern erlaubt sein.

Mein Validator dafür sieht so aus:

Code: Alles auswählen

class IntValidator( wx.PyValidator ):
	def Clone (self):
		return self.__class__()
	def Validate(self, window):
		try:
			value = int( window.GetValue())
			return true
		except ValueError:
			return false
	def TransferToWindow(self):
		return True
	def TransfertFromWindow(self):
		return True
Dann setze ich den Validator so: (self.y ist das TextCtrl)

Code: Alles auswählen

self.y.SetValidator( IntValidator() )
Passieren tut deshalb jedoch nix. Ich kann Buchstaben in das Feld reintippen soviel ich will! Was überseh ich? Außerdem: Was macht denn der Validator wenn er eine Fehleingabe findet: Behält das Feld den Fokus, kann ich das Feld irgendwie einfärben, kann ich den Wert vor dem ändern hineinschreiben, ...

Ich hoffe ich habe das Konzept der Validatoren richtig verstanden - könnte natürlich auch sein dass ich auf dem falschen Bahnsteig auf den Zug warte. :roll:

Vielen Dank vorab für die Hilfe,
LG Florian Lagg
http://www.it-konzept.at
BlackJack

@laggflor: Die `Validate()`-Methode wird aufgerufen wenn ein Standard-"Ok"-Button aufgerufen wird -- dann wird nämlich die `Window.Validate()`-Methode aufgerufen auf dem `Window` in dem der `Button` steckt. Und diese Methode sucht in dem Fenster alle `Validator`-Exemplare, ruft deren `Validate()` auf und dann `TransferFromWindow()`.

Wenn Du das Eingeben von Nichtziffern verhindern willst, dann musst Du in dem `Validator` die `EVT_CHAR`-Ereignisse abfangen und entsprechend darauf reagieren. Also im Handler `Skip()` auf dem Ereignisobjekt aufrufen, damit das auch an das Eingabe-Widget weiter geht.

Anzeigen von irgendwelchen Fehlern, zum Beispiel ein Dialog oder so, liegt bei Dir.

Speziell für Zahlen gibt's ja schon `IntCtrl`. Und eventuell kannst Du auch etwas aus `wx.lib.masked` für Deine Zwecke gebrauchen.
laggflor
User
Beiträge: 8
Registriert: Mittwoch 17. September 2008, 21:32

Vielen vielen Dank!

Nur Ziffern war nur ein Beispiel... trotzdem kannte ich das IntCtrl nicht. Hm... ich dachte die Auswahl in wxFormBuilder wäre vollständig - naja.

Zumindest hab ich jetzt kapiert was ein Validator macht - so macht das auch Sinn wenn man sich das überlegt.

Hab ich schon Danke gesagt?
Falls nicht: Danke, Danke, Danke, Danke, Danke!

LG Florian.
www.it-konzept.at
BlackJack

@laggflor: Die Auswahl in den GUI-Designern ist eigentlich nie vollständig. Dazu gibt es zu viele "Spezial"-Widgets bei wxPython.
Antworten