序文
TextCtrl wxPythonのフレームワークは非常に実用的なテキスト入力コントロールで、私たちはしばしばTextCtrlに必要な入力のような制約を行います、そのよう1.2,4.5,100これらの入力は、このような.8,4tや他の入力を禁止することが可能と(あなたが番号を入力することができます入力の種類に順番にstrのヘルプたちを例外の発生を防止するなど、他のタイプはint、floatを決定するために余分な時間を必要としません。今日、私はwxPythonのAPIへのアクセスを持っているが、私たちのニーズを満たすためにValidatorクラスを見つけました。実際には、だけでなく、数字のみを入力することができ、このニーズを満たすため、Validatorは、このクラスの使用をマスターし、我々は、任意のカスタム要件を満たすことができます。
コーディング
最初wx.Validatorから継承した新しいクラスを作成する必要があります
import wx
class MyNumberValidator(wx.Validator):# 创建验证器子类
def __init__(self):
wx.Validator.__init__(self)
def Clone(self):
return MyNumberValidator()
def Validate(self,win):#1 使用验证器方法
return True
def TransferToWindow(self):
return True
def TransferFromWindow(self):
return True
同時に、あなたはオーバーライドする必要がありますのinit()(完全初期化)、クローン()その後、限り、あなたがライン上でテンプレートとしてそれらを使用するよう(リターンクラスの現在のインスタンス)を5つの方法、およびこれに基づき、当社独自のロジックで結合されました。
需要が論理を実現するために追加されます
import wx
# import wx.lib.imagebrowser
class MyNumberValidator(wx.Validator):# 创建验证器子类
def __init__(self):
wx.Validator.__init__(self)
self.ValidInput = ['.','0','1','2','3','4','5','6','7','8','9']
self.StringLength = 0
self.Bind(wx.EVT_CHAR,self.OnCharChanged) # 绑定字符改变事件
def OnCharChanged(self,event):
# 得到输入字符的 ASCII 码
keycode = event.GetKeyCode()
# 退格(ASCII 码 为8),删除一个字符。
if keycode == 8:
self.StringLength -= 1
#事件继续传递
event.Skip()
return
# 把 ASII 码 转成字符
InputChar = chr(keycode)
if InputChar in self.ValidInput:
# 第一个字符为 .,非法,拦截该事件,不会成功输入
if InputChar == '.' and self.StringLength == 0:
return False
# 在允许输入的范围,继续传递该事件。
else:
event.Skip()
self.StringLength += 1
return True
return False
def Clone(self):
return MyNumberValidator()
def Validate(self,win):#1 使用验证器方法
return True
def TransferToWindow(self):
return True
def TransferFromWindow(self):
return True
注このコード行そのself.Bind(wx.EVT_CHAR,self.OnCharChanged) # 绑定字符输入事件
ユーザーが文字を入力すると、イベントはに初めてとなる、ということを意味、OnCharChanged
、メソッドの治療OnCharChanged
に特には、注意を払うevent.Skip()
税関検査の正当性を超えることを意味し、このコード行、、、イベントが提供し続けることができ、あなたは文字にtextctrl.valueに参加し、関数処理として表示することができ、そうでない場合は、イベント中にOnCharChanged
傍受された、入力の失敗を表示されません。
textctrl結合検証サブクラスを制御するには。
textctrlを作成するときに非常に単純な、単にキーワードパラメータを追加指定
wx.TextCtrl(self,validator=MyNumberValidator(),style=wx.TE_CENTER)
style=wx.TE_CENTER
入力文字センター
validate()メソッド以外
私たちは、ことがわかったValidator
クラスとクラス名最も類似の方法は、Validate()
次のように最初に、ある実際には、この方法は、一般的に使用された手順で、使用されていないValidate()
プラスビジネス・ロジック・メソッド。
def Validate(self,win):#1 使用验证器方法
print(111)
textCtrl = self.GetWindow()
text = textCtrl.GetValue()
valid_text = ''
for i in text:
if i in self.ValidInput:
valid_text += i
textCtrl.SetValue(valid_text)
return True
そして、外の正当性を検証するためにそれを呼び出します
self.n1.GetValidator().Validate(self.n1)
エントリの合法性を確認することができなければならない検証は()も正当性を検証することができますが、それは、入力イベントを処理することはできません完了し、同等の効果が「遅ればせながら」。
完全な例
# -*- coding: utf-8 -*-
# author: inspurer(月小水长)
# pc_type lenovo
# create_time: 2019/4/12 13:37
# file_name: validator.py
# github https://github.com/inspurer
# qq邮箱 [email protected]
# 微信公众号 月小水长(ID: inspurer)
import wx
# import wx.lib.imagebrowser
class MyNumberValidator(wx.Validator):# 创建验证器子类
def __init__(self):
wx.Validator.__init__(self)
self.ValidInput = ['.','0','1','2','3','4','5','6','7','8','9']
self.StringLength = 0
self.Bind(wx.EVT_CHAR,self.OnCharChanged) # 绑定字符输入事件
def OnCharChanged(self, event):
# 得到输入字符的 ASCII 码
keycode = event.GetKeyCode()
# 退格(ASCII 码 为8),删除一个字符。
if keycode == 8:
self.StringLength -= 1
# 事件继续传递
event.Skip()
return
# 把 ASII 码 转成字符
InputChar = chr(keycode)
if InputChar in self.ValidInput:
# 第一个字符为 .,非法,拦截该事件,不会成功输入
if InputChar == '.' and self.StringLength == 0:
return False
# 在允许输入的范围,继续传递该事件。
else:
event.Skip()
self.StringLength += 1
return True
return False
def Clone(self):
return MyNumberValidator()
def Validate(self,win):#1 使用验证器方法
print(111)
textCtrl = self.GetWindow()
text = textCtrl.GetValue()
valid_text = ''
for i in text:
if i in self.ValidInput:
valid_text += i
textCtrl.SetValue(valid_text)
return True
def TransferToWindow(self):
return True
def TransferFromWindow(self):
return True
class GUI(wx.Frame):
def __init__(self,parent):
wx.Frame.__init__(self, parent=parent, title="wxPython开发实战",size=(400,300),style=wx.DEFAULT_FRAME_STYLE ^ wx.RESIZE_BORDER ^ wx.MAXIMIZE_BOX )
self.Center()
self.SetBackgroundColour('white')
font = wx.Font(16,wx.DECORATIVE, wx.NORMAL, wx.NORMAL)
self.n1 = wx.TextCtrl(self,validator=MyNumberValidator(),pos=(100,30),size=(180,45),style=wx.TE_CENTER)
self.n1.SetFont(font)
self.n1.SetBackgroundColour('#95ec69')
self.n1.SetHint('请输入第一个数字')
self.n2 = wx.TextCtrl(self,validator=MyNumberValidator(),pos=(100,100),size=(180,45),style=wx.TE_CENTER)
self.n2.SetFont(font)
self.n2.SetBackgroundColour('#95ec69')
self.n2.SetHint('请输入第二个数字')
self.config = wx.Button(self,label="验证输入框一的合法性",pos=(115,170),size=(150,40))
self.config.SetBackgroundColour('#95ec69')
self.Bind(wx.EVT_BUTTON,self.configClicked,self.config)
def configClicked(self,event):
self.n1.GetValidator().Validate(self.n1)
pass
if __name__ == "__main__":
app = wx.App()
GUI(None).Show()
app.MainLoop()