wx.TextCtrlのバリデーション考察

バリデーションが大変だったのでメモと考察
*プログラムはエラーを表示するだけのものです

一般的だと思われるメッセージボックスで表示する

import wx
 
class TextObjectValidator(wx.PyValidator):
    def __init__(self):
        wx.PyValidator.__init__(self)
        print('v init')
 
    def Clone(self):
        print('v Clone')
        return TextObjectValidator()
 
    def Validate(self, win):
        print('v Validate')
        textCtrl = self.GetWindow()
        text = textCtrl.GetValue()
        print(text)
        wx.MessageBox(u"エラーメッセージを表示", "Error!!", wx.OK | wx.ICON_ERROR)
        return False
 
    def TransferToWindow(self):
        print('v to win')
        return True
 
    def TransferFromWindow(self):
        print('v from win')
        return True
 
class MyFrame(wx.Frame):
    def __init__(self, *args, **kw):
        super(MyFrame, self).__init__(*args, **kw)
        self.SetExtraStyle(wx.WS_EX_VALIDATE_RECURSIVELY)
 
        mainSizer = wx.BoxSizer( wx.VERTICAL )
 
        self.panel = wx.Panel( self, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, wx.TAB_TRAVERSAL )
        vbox = wx.BoxSizer( wx.VERTICAL )
 
        self.text1 = wx.TextCtrl( self.panel, wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, wx.DefaultSize, 0)
        self.text1.SetValidator(TextObjectValidator())
        vbox.Add( self.text1, 0, wx.ALL, 5 )
 
        self.btn1 = wx.Button( self.panel, wx.ID_ANY, u"Click", wx.DefaultPosition, wx.DefaultSize, 0 )
        vbox.Add( self.btn1, 0, wx.ALL, 5 )
 
        self.panel.SetSizer( vbox )
        self.panel.Layout()
        vbox.Fit( self.panel )
        mainSizer.Add( self.panel, 1, wx.EXPAND |wx.ALL, 5 )
 
        self.SetSizer( mainSizer )
        self.Layout()
 
        self.Centre( wx.BOTH )
 
        self.btn1.Bind( wx.EVT_BUTTON, self.onBtn1Click )
 
    def onBtn1Click( self, event ):
        print('onBtnClick')
        self.Validate()
 
def main():
    app = wx.App()
    ex = MyFrame(None)
    ex.Show()
    app.MainLoop()
 
if __name__ == '__main__':
    main()

入力エリアにエラーメッセージを表示する

import wx
  
class MyFrame(wx.Frame):
    def __init__(self, *args, **kw):
        super(MyFrame, self).__init__(*args, **kw)
  
        mainSizer = wx.BoxSizer( wx.VERTICAL )
   
        self.panel = wx.Panel( self, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, wx.TAB_TRAVERSAL )
        vbox = wx.BoxSizer( wx.VERTICAL )
  
        self.text1 = wx.TextCtrl( self.panel, wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, wx.DefaultSize, 0)
        vbox.Add( self.text1, 0, wx.ALL, 5 )
  
        self.btn1 = wx.Button( self.panel, wx.ID_ANY, u"Click", wx.DefaultPosition, wx.DefaultSize, 0 )
        vbox.Add( self.btn1, 0, wx.ALL, 5 )
  
        self.panel.SetSizer( vbox )
        self.panel.Layout()
        vbox.Fit( self.panel )
        mainSizer.Add( self.panel, 1, wx.EXPAND |wx.ALL, 5 )
  
        self.SetSizer( mainSizer )
        self.Layout()
  
        self.Centre( wx.BOTH )
  
        self.btn1.Bind( wx.EVT_BUTTON, self.onBtn1Click )
  
    def onBtn1Click( self, event ):
        print('onBtnClick')
        raw_value = self.text1.GetValue().strip()
        # numeric check
        if all(x in '0123456789.+-' for x in raw_value):
            pass
        else:
            self.text1.ChangeValue(u"数字のみです")
  
def main():
    app = wx.App()
    ex = MyFrame(None)
    ex.Show()
    app.MainLoop()
  
if __name__ == '__main__':
    main()

WEBのフォームで良くある入力エリアの近くに表示する

import wx
 
class MyFrame(wx.Frame):
    def __init__(self, *args, **kw):
        super(MyFrame, self).__init__(*args, **kw)
 
        mainSizer = wx.BoxSizer( wx.VERTICAL )
 
        self.panel = wx.Panel( self, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, wx.TAB_TRAVERSAL )
        vbox = wx.BoxSizer( wx.VERTICAL )
 
        self.text1 = wx.TextCtrl( self.panel, wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, wx.DefaultSize, 0)
        vbox.Add( self.text1, 0, wx.ALL, 5 )
        self.st1 = wx.StaticText( self.panel, wx.ID_ANY, u"", wx.DefaultPosition, wx.DefaultSize, 0 )
        vbox.Add( self.st1, 0, wx.ALL|wx.ALIGN_CENTER_VERTICAL, 5 )
 
        self.btn1 = wx.Button( self.panel, wx.ID_ANY, u"Click", wx.DefaultPosition, wx.DefaultSize, 0 )
        vbox.Add( self.btn1, 0, wx.ALL, 5 )
 
        self.panel.SetSizer( vbox )
        self.panel.Layout()
        vbox.Fit( self.panel )
        mainSizer.Add( self.panel, 1, wx.EXPAND |wx.ALL, 5 )
 
        self.SetSizer( mainSizer )
        self.Layout()
 
        self.Centre( wx.BOTH )
 
        self.btn1.Bind( wx.EVT_BUTTON, self.onBtn1Click )
 
    def onBtn1Click( self, event ):
        print('onBtnClick')
        print(self.text1.GetValue())
        raw_value = self.text1.GetValue().strip()
        # numeric check
        if all(x in '0123456789.+-' for x in raw_value):
            pass
        else:
            self.st1.SetLabel(u"数字のみです")
 
def main():
    app = wx.App()
    ex = MyFrame(None)
    ex.Show()
    app.MainLoop()
 
if __name__ == '__main__':
    main()

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)