戦闘制御のwxPythonの開発を入力制約の入力にバリバリデータを使用TextCtrl

序文

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()
84元記事公開 ウォンの賞賛250 ビュー150,000 +を

おすすめ

転載: blog.csdn.net/ygdxt/article/details/89238491