バリデーションが大変だったのでメモと考察
*プログラムはエラーを表示するだけのものです
一般的だと思われるメッセージボックスで表示する
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()
日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)