2010-02-04 10 views
5

Tôi cần xác thực hộp văn bản với wx.Textvalidator. Xin hãy giúp tôi làm điều này?wx.TextCtrl và wx.Validator

Tôi làm cách nào để sử dụng wx.FILTER_ALPHA với trình xác thực và nếu người dùng nhập sai thông tin, làm cách nào tôi có thể gửi tin nhắn cho họ?

tôi cần xác thực tất cả các yếu tố đầu vào khi nhấp vào nút lưu?

bất kỳ ai có thể cung cấp cho tôi mã mẫu cho điều này không?

Trả lời

5

Đây là tính năng của wxWidgets và không được triển khai trong wxPython.

http://www.wxpython.org/docs/api/wx.TextValidator-class.html - không tìm thấy

khi:

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

Có một bản demo của Validators trong bản demo 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

Nhưng nếu tôi cần hộp văn bản đầu tiên để hạn chế bảng chữ cái và hộp văn bản thứ hai để hạn chế số thì tôi nên làm gì? cho dù tôi cần phải viết hai lớp riêng biệt? – RSK

+0

Có, lý tưởng bạn sẽ đặt chúng trong một số thư viện tiện ích có thể sử dụng lại. –

+0

thankz cho câu trả lời .... – RSK

1

tôi đã không thể làm cho mã mẫu hoạt động đúng trong mã của tôi (không sử dụng hộp thoại nào cả, nhưng một txtctrl trong bảng điều khiển), mặc dù nó hoạt động chính xác trong bản trình diễn (xem hình).

tôi đã kết thúc bằng một đoạn từ một trang web khác và cảm thấy bắt buộc phải ghi lại nó ở đây:

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

Đây là cách duy nhất mà tôi có thể nhận được mã xác nhận tùy chỉnh của tôi để được gọi. Gọi self.tc.Validate() không hoạt động ở tất cả cũng như self.Validate(), cũng không phải là một trong hai biểu diễn truyền qua cửa sổ dưới dạng tham số.

tham khảo: link text

2

Vấn đề có lẽ là thast bạn có ctrl trong một bảng điều khiển trong hộp thoại. Đặt cờ đệ quy trên hộp thoại để bật mã xác thực để tìm các điều khiển với trình xác thực đệ quy:

self.SetExtraStyle(wx.WS_EX_VALIDATE_RECURSIVELY) 
4

Có nhiều cách để thực hiện việc này. Bản demo wxPython thực sự cho thấy cách chỉ cho phép các chữ số hoặc chỉ alpha. Dưới đây là ví dụ dựa trên điều đó:

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() 

Một cách tiếp cận khác sẽ là sử dụng Điều khiển mặt nạ bằng cách sử dụng wx.lib.masked. Bản demo wxPython cũng có các ví dụ về điều này.