[wxPython] Validator for TxtCtrl to trigger with a custom Button handler

F. GEIGER franz.geiger at fh-vorarlberg.ac.at
Wed Jul 21 07:23:18 EDT 2004


def _onButton_(self, event):
   success = self._myTextCtrl.Validate()
   return

self is the Frame here. _onButton_ therefore belongs to the frame and was
bound with wx.Button.Bind.

HTH
F. GEIGER


"Lo?c Mah?" <loic.mahe at free.fr> wrote in message
news:27a5ac50.0407200650.56096584 at posting.google.com...
> Hello
>
> I try to use a Validator for a TxtCtrl placed in a Panel with a Button
> in order to trigger the Validator and test the content of TxtCtrl.
>
> I have looked into wxPython documentation and demo and searched in
> google, but I am still unsuccessful yet.
>
> My problem is that I do not manage to call the Validate() method of my
> Validator from the button handler.
>
> When I try to run my program I always have the following error:
> AttributeError: 'Frame' object has no attribute 'Validate'
>
> This error occurs when I call the Validate method inside my OnSave
> button handler.
>
> I tried to call the Validate method on different parents objects of
> the
> button and text control without success.
>
> Thanks for you help!
>
> Loïc
>
>
> Here is the code:
>
>
> #!/usr/bin/env python
>
> import wx
>
> class TextObjectValidator(wx.PyValidator):
>      def __init__(self):
>          print "init"
>          wx.PyValidator.__init__(self)
>
>      def Clone(self):
>          print "Clone"
>          return TextObjectValidator()
>
>      def Validate(self, win):
>          print "Validate"
>          textCtrl = self.GetWindow()
>          text = textCtrl.GetValue()
>          if len(text) == 0:
>              wx.MessageBox("A text object must contain some text!",
> "Error")
>              textCtrl.SetBackgroundColour("pink")
>              textCtrl.SetFocus()
>              textCtrl.Refresh()
>              return False
>          else:
>              textCtrl.SetBackgroundColour(
>                  wx.SystemSettings_GetColour(wx.SYS_COLOUR_WINDOW))
>              textCtrl.Refresh()
>              return True
>
>      def TransferToWindow(self):
>          print "TransferToWindow"
>          return True # Prevent wxDialog from complaining.
>
>      def TransferFromWindow(self):
>          print "TransferFromWindow"
>          return True # Prevent wxDialog from complaining.
>
>
> class Frame(wx.Frame):
>
>     def __init__(self, parent=None, id=-1, title='<Title here>',
>                  pos=wx.DefaultPosition, size=(400, 200)):
>         wx.Frame.__init__(self, parent, id, title, pos, size)
>         self.CenterOnScreen()
>
>         panel = wx.Panel(self, -1)
>         panel.SetBackgroundColour(wx.Colour(255, 255, 255))
>
>         fgs = wx.FlexGridSizer(cols=2, vgap=4, hgap=4)
>
>         self.label = wx.StaticText(panel, -1, 'word'+":")
>         self.tc = wx.TextCtrl(panel, -1, 'word', size=(50,-1),
> validator=TextObjectValidator() )
>         fgs.Add(self.label, 1, flag=wx.ALIGN_RIGHT |
> wx.ALIGN_CENTER_VERTICAL)
>         fgs.Add(self.tc, 1, flag=wx.EXPAND|wx.RIGHT, border=25)
>
> b = wx.Button(panel, 2000, "Save"  )
> fgs.Add(b, 1, flag=wx.EXPAND | wx.RIGHT)
> wx.EVT_BUTTON(panel, b.GetId(), self.OnSave)
>
>         panel.InitDialog()
>         panel.SetSizer( fgs )
>         panel.SetAutoLayout(1)
>
>     def OnSave(self, event):
>         print "OnSave"
> ### ERROR BELOW:
>         if self.Validate():
>             print "Validate OK"
>         else:
>             print "Validate KO"
>         pass
>
>
> class App(wx.App):
>
>     def OnInit(self):
>         self.frame = Frame()
>         self.frame.Show()
>         self.SetTopWindow(self.frame)
>         return True
>
>
> def main():
>     app = App()
>     app.MainLoop()
>
>
> if __name__ == '__main__':
>     main()





More information about the Python-list mailing list