views:

26

answers:

1

I've written a dialog in wxPtyhon with two comboboxes to which I've attached a custom validator, the purpose being to insure that, if a value is typed, it is an numeric string. Problem is, the validators aren't being invoked. What am I doing wrong?

    import wx

    # my custom validator class

    class NumericObjectValidator(wx.Validator):
       def __init__(self):
          wx.Validator.__init__(self)

       def Clone(self):
          return NumericObjectValidator()

       # Why isn't this method being called when the user types in the CB field?
       def Validate(self, win):
          cbCtrl = self.GetWindow()
          text = cbCtrl.GetValue()
          print 'control value=',text
          return True

    class SizeDialog(wx.Dialog):
       def __init__(self, parent):
          wx.Dialog.__init__(self, parent, -1, 'Select Size', size=(200,135))

          panel = wx.Panel(self, -1, size=self.GetClientSize())

          sizes = map(str, range(3,21))
          wx.StaticText(panel, -1, 'Rows:', pos=(10, 15))
          self.rows = wx.ComboBox(panel, -1, value='8', choices=sizes,
             style=wx.CB_DROPDOWN, pos=(80,15), validator=NumericObjectValidator())

          wx.StaticText(panel, -1, 'Columns:', pos=(10,40))
          self.cols = wx.ComboBox(panel, -1, choices=sizes, style=wx.CB_DROPDOWN,
             pos=(80,40), value='8', validator=NumericObjectValidator())

          cancel = wx.Button(panel,wx.ID_CANCEL,'Cancel', pos=(20,75))
          wx.Button(panel,wx.ID_OK,'OK', pos=(100,75)).SetDefault()

       def TransferToWindow(self):
          return True

       def TransferFromWindow(self):
          return True

       def get_size(self):
          r = int(self.rows.GetValue())
          c = int(self.cols.GetValue())
          return (c,r)

    if __name__ == "__main__":
       app = wx.App(0)
       dlg = SizeDialog(None)
       dlg.ShowModal()
       dlg.Destroy()
A: 

I have no idea why, but copying the wxPython demo works okay.

import wx
import string

# my custom validator class

class NumericObjectValidator(wx.PyValidator):
    def __init__(self):
        wx.PyValidator.__init__(self)
        self.Bind(wx.EVT_CHAR, self.OnChar)

    def Clone(self):
        return NumericObjectValidator()

    def Validate(self, win):
        tc = self.GetWindow()
        val = tc.GetValue()

        for x in val:
            if x not in string.digits:
                return False

        return True


    def OnChar(self, event):
        key = event.GetKeyCode()

        if key < wx.WXK_SPACE or key == wx.WXK_DELETE or key > 255:
            event.Skip()
            return

        if chr(key) in string.digits:
            event.Skip()

        return


class SizeDialog(wx.Dialog):
   def __init__(self, parent):
      wx.Dialog.__init__(self, parent, -1, 'Select Size', size=(200,135))

      panel = wx.Panel(self, -1, size=self.GetClientSize())

      sizes = map(str, range(3,21))
      wx.StaticText(panel, -1, 'Rows:', pos=(10, 15))
      self.rows = wx.ComboBox(panel, -1, value='8', choices=sizes,
         style=wx.CB_DROPDOWN, pos=(80,15), validator=NumericObjectValidator())

      wx.StaticText(panel, -1, 'Columns:', pos=(10,40))
      self.cols = wx.ComboBox(panel, -1, style=wx.CB_DROPDOWN, validator=NumericObjectValidator())

      cancel = wx.Button(panel,wx.ID_CANCEL,'Cancel', pos=(20,75))
      wx.Button(panel,wx.ID_OK,'OK', pos=(100,75)).SetDefault()

   def TransferToWindow(self):
      return True

   def TransferFromWindow(self):
      return True

   def get_size(self):
      r = int(self.rows.GetValue())
      c = int(self.cols.GetValue())
      return (c,r)

if __name__ == "__main__":
   app = wx.App(0)
   dlg = SizeDialog(None)
   dlg.ShowModal()
   dlg.Destroy()
Steven Sproat
My guess is it's because the OP is using wx.Validator whereas the demo uses wx.PyValidator.
Mike Driscoll
Actually, I tried them both. Neither work for me. I'll try Steven's example now and see if that works.
sizzzzlerz
mine works, tested on Win XP. The one in the original post didn't.
Steven Sproat