2010-02-04 2 views
5

मुझे wx.Textvalidator के साथ टेक्स्टबॉक्स को सत्यापित करने की आवश्यकता है। कोई भी कृपया मुझे ऐसा करने में मदद करें?wx.TextCtrl और wx.Validator

मैं वैधताओं के साथ wx.FILTER_ALPHA का उपयोग कैसे कर सकता हूं और यदि उपयोगकर्ता गलत इनपुट दे रहा है तो मैं उन्हें एक संदेश कैसे दे सकता हूं?

मुझे सहेजें बटन पर क्लिक करते समय सभी इनपुट को सत्यापित करने की आवश्यकता है?

क्या कोई मुझे इसके लिए नमूना कोड प्रदान कर सकता है?

उत्तर

5

यह wxwidgets की एक विशेषता है, और wxPython में लागू नहीं किया गया है।

http://www.wxpython.org/docs/api/wx.TextValidator-class.html - नहीं मिला

जबकि:

http://docs.wxwidgets.org/trunk/classwx_text_validator.html http://docs.wxwidgets.org/stable/wx_wxtextvalidator.html

wxPython डेमो में सत्यापनकर्ता के एक डेमो है:

import wx 

class TextObjectValidator(wx.PyValidator): 
    """ This validator is used to ensure that the user has entered something 
     into the text object editor dialog's text field. 
    """ 
    def __init__(self): 
     """ Standard constructor. 
     """ 
     wx.PyValidator.__init__(self) 



    def Clone(self): 
     """ Standard cloner. 

      Note that every validator must implement the Clone() method. 
     """ 
     return TextObjectValidator() 


    def Validate(self, win): 
     """ Validate the contents of the given text control. 
     """ 
     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): 
     """ Transfer data from validator to window. 

      The default implementation returns False, indicating that an error 
      occurred. We simply return True, as we don't do any data transfer. 
     """ 
     return True # Prevent wxDialog from complaining. 


    def TransferFromWindow(self): 
     """ Transfer data from window to validator. 

      The default implementation returns False, indicating that an error 
      occurred. We simply return True, as we don't do any data transfer. 
     """ 
     return True # Prevent wxDialog from complaining. 

#---------------------------------------------------------------------- 

class TestValidateDialog(wx.Dialog): 
    def __init__(self, parent): 
     wx.Dialog.__init__(self, parent, -1, "Validated Dialog") 

     self.SetAutoLayout(True) 
     VSPACE = 10 

     fgs = wx.FlexGridSizer(0, 2) 

     fgs.Add((1,1)); 
     fgs.Add(wx.StaticText(self, -1, 
          "These controls must have text entered into them. Each\n" 
          "one has a validator that is checked when the Okay\n" 
          "button is clicked.")) 

     fgs.Add((1,VSPACE)); fgs.Add((1,VSPACE)) 

     label = wx.StaticText(self, -1, "First: ") 
     fgs.Add(label, 0, wx.ALIGN_RIGHT|wx.CENTER) 

     fgs.Add(wx.TextCtrl(self, -1, "", validator = TextObjectValidator())) 

     fgs.Add((1,VSPACE)); fgs.Add((1,VSPACE)) 

     label = wx.StaticText(self, -1, "Second: ") 
     fgs.Add(label, 0, wx.ALIGN_RIGHT|wx.CENTER) 
     fgs.Add(wx.TextCtrl(self, -1, "", validator = TextObjectValidator())) 


     buttons = wx.StdDialogButtonSizer() #wx.BoxSizer(wx.HORIZONTAL) 
     b = wx.Button(self, wx.ID_OK, "OK") 
     b.SetDefault() 
     buttons.AddButton(b) 
     buttons.AddButton(wx.Button(self, wx.ID_CANCEL, "Cancel")) 
     buttons.Realize() 

     border = wx.BoxSizer(wx.VERTICAL) 
     border.Add(fgs, 1, wx.GROW|wx.ALL, 25) 
     border.Add(buttons) 
     self.SetSizer(border) 
     border.Fit(self) 
     self.Layout() 



app = wx.App(redirect=False) 
f = wx.Frame(parent=None) 
f.Show() 
dlg = TestValidateDialog(f) 
dlg.ShowModal() 
dlg.Destroy() 

app.MainLoop() 
+0

लेकिन अगर मुझे संख्याओं को प्रतिबंधित करने के लिए अक्षरों और दूसरे टेक्स्ट बॉक्स को प्रतिबंधित करने के लिए पहले टेक्स्टबॉक्स की आवश्यकता है तो मुझे क्या करना चाहिए? क्या मुझे दो अलग-अलग वर्ग लिखने की आवश्यकता है? – RSK

+0

हां, आदर्श रूप से आप उन्हें कुछ पुनः उपयोग करने योग्य उपयोगिता पुस्तकालय में रखेंगे। –

+0

उत्तर के लिए धन्यवाद .... – RSK

1

मैं करने में असमर्थ था नमूना कोड मेरे कोड के भीतर ठीक से काम करता है (एक संवाद का उपयोग नहीं कर रहा है लेकिन एक txtctrl पर एक पैनल के भीतर), भले ही यह डेमो में सही ढंग से काम करता है (आंकड़ा जाओ)।

self.tc.GetValidator().Validate(self.tc) 

यही एक रास्ता है कि मैं मिल सकता है अपने कस्टम सत्यापनकर्ता कोड के नाम से जाना था:

किसी और स्थल से एक टुकड़ा का उपयोग करने और इसे यहाँ दस्तावेज़ करने के लिए बाध्य महसूस समाप्त हो गया। Self.tc.Validate() को कॉल करना बिल्कुल काम नहीं करता और न ही स्वयं करता था। वैध(), न ही पैरामीटर के रूप में विंडो को पास करने का प्रतिनिधित्व।

संदर्भ: thast आप संवाद के भीतर एक पैनल में ctrl है link text

2

समस्या शायद है। रिकर्सिवली प्रमाणकों के साथ नियंत्रण के लिए देखने के लिए सत्यापन कोड सक्षम करने के लिए संवाद पर पुनरावर्ती ध्वज सेट करें:

self.SetExtraStyle(wx.WS_EX_VALIDATE_RECURSIVELY) 
4

तरीके यह करने के लिए की बहुत सारी हैं। WxPython डेमो वास्तव में दिखाता है कि केवल अंक या केवल अल्फा को अनुमति दें। यहां एक उदाहरण दिया गया है:

import wx 
import string 

######################################################################## 
class CharValidator(wx.PyValidator): 
    ''' Validates data as it is entered into the text controls. ''' 

    #---------------------------------------------------------------------- 
    def __init__(self, flag): 
     wx.PyValidator.__init__(self) 
     self.flag = flag 
     self.Bind(wx.EVT_CHAR, self.OnChar) 

    #---------------------------------------------------------------------- 
    def Clone(self): 
     '''Required Validator method''' 
     return CharValidator(self.flag) 

    #---------------------------------------------------------------------- 
    def Validate(self, win): 
     return True 

    #---------------------------------------------------------------------- 
    def TransferToWindow(self): 
     return True 

    #---------------------------------------------------------------------- 
    def TransferFromWindow(self): 
     return True 

    #---------------------------------------------------------------------- 
    def OnChar(self, event): 
     keycode = int(event.GetKeyCode()) 
     if keycode < 256: 
      #print keycode 
      key = chr(keycode) 
      #print key 
      if self.flag == 'no-alpha' and key in string.letters: 
       return 
      if self.flag == 'no-digit' and key in string.digits: 
       return 
     event.Skip() 

######################################################################## 
class ValidationDemo(wx.Frame): 
    """""" 

    #---------------------------------------------------------------------- 
    def __init__(self): 
     """Constructor""" 
     wx.Frame.__init__(self, None, wx.ID_ANY, 
          "Text Validation Tutorial") 

     panel = wx.Panel(self) 
     textOne = wx.TextCtrl(panel, validator=CharValidator('no-alpha')) 
     textTwo = wx.TextCtrl(panel, validator=CharValidator('no-digit')) 

     sizer = wx.BoxSizer(wx.VERTICAL) 
     sizer.Add(textOne, 0, wx.ALL, 5) 
     sizer.Add(textTwo, 0, wx.ALL, 5) 
     panel.SetSizer(sizer) 

# Run the program 
if __name__ == "__main__": 
    app = wx.App(False) 
    frame = ValidationDemo() 
    frame.Show() 
    app.MainLoop() 

wx.lib.masked का उपयोग करके मास्क किए गए नियंत्रणों का उपयोग करने का एक वैकल्पिक दृष्टिकोण होगा। WxPython डेमो में इसके उदाहरण भी हैं।

संबंधित मुद्दे