from wxPython.wx import * import string class floatValidator(wxPyValidator): def __init__(self, obj=None, attrName=""): wxPyValidator.__init__(self) self.numList = ['1','2','3','4','5','6','7','8','9','0','.'] EVT_CHAR(self, self.OnChar) self.obj = obj self.attrName = attrName def Clone(self): return floatValidator(self.obj, self.attrName) def TransferToWindow(self): if self.obj and hasattr(self.obj, self.attrName): tc = wxPyTypeCast(self.GetWindow(), "wxTextCtrl") tc.SetValue(str(getattr(self.obj, self.attrName))) return true def TransferFromWindow(self): if self.obj and self.attrName: tc = wxPyTypeCast(self.GetWindow(), "wxTextCtrl") text = tc.GetValue() setattr(self.obj, self.attrName, string.atof(text)) return true def Validate(self, win): tc = wxPyTypeCast(self.GetWindow(), "wxTextCtrl") val = tc.GetValue() for x in val: if x not in self.numList: return false return true def OnChar(self, event): key = event.KeyCode() if key < WXK_SPACE or key == WXK_DELETE or key > 255: event.Skip() return if chr(key) in self.numList: event.Skip() return if not wxValidator_IsSilent(): wxBell() # Returning without calling even.Skip eats the event before it # gets to the text control return class MyDialog(wxDialog): def __init__(self, parent): wxDialog.__init__(self, parent, -1, "hello") self.theValue = 555.12 fltValidator = floatValidator(self, "theValue") Vbox = wxBoxSizer(wxVERTICAL) Tbox = wxBoxSizer(wxHORIZONTAL) Tbox.Add(wxStaticText(self, -1, "Initial Balance"), 0, wxALL,5) Tbox.Add(wxTextCtrl(self, 13, "123.45", validator = fltValidator, size=(100, -1)), 0, wxALL,5) Vbox.Add(Tbox, 0, 0) Tbox = wxBoxSizer(wxHORIZONTAL) Tbox.Add(wxButton(self, wxID_OK, "Ok"), 0, wxALL,5) Tbox.Add(wxButton(self, wxID_CANCEL, "Cancel"), 0, wxALL,5) Vbox.Add(Tbox, 0, 0) self.SetAutoLayout(true) self.SetSizer(Vbox) Vbox.Fit(self) class TestFrame(wxFrame): def __init__(self, parent): wxFrame.__init__(self, parent, -1, "Testing...", size=(150,75)) wxButton(self, 25, "Click Me") EVT_BUTTON(self, 25, self.OnClick) def OnClick(self, event): dlg = MyDialog(self) dlg.ShowModal() print dlg.theValue dlg.Destroy() app = wxPySimpleApp() frame = TestFrame(None) frame.Show(true) app.MainLoop()