数値のみを受け入れるテキスト コントロールが必要です。(45 や 366 などの整数値のみ)
これを行う最善の方法は何ですか?
英数字コードをチェックして、同様のことをしなければなりませんでした。EVT_CHARのヒントは正しいことでした:
class TestPanel(wx.Panel):
def __init__(self, parent):
wx.Panel.__init__(self, parent, -1)
self.entry = wx.TextCtrl(self, -1)
self.entry.Bind(wx.EVT_CHAR, self.handle_keypress)
def handle_keypress(self, event):
keycode = event.GetKeyCode()
if keycode < 255:
# valid ASCII
if chr(keycode).isalnum():
# Valid alphanumeric character
event.Skip()
IntCtrl
、、Masked Edit Control
およびNumCtrl
はすべて、さまざまなレベルの制御でこれを実行するように設計されています。「その他のWindows/コントロール」の下にあるwxデモをチェックして、それらがどのように機能するかを確認してください。
(または、代わりに生のTextCtrlを使用してこれを直接行うことを本当に楽しみにしている場合は、EVT_CHARイベントをキャッチし、文字をテストし、許可された文字である場合はevt.Skip()を呼び出します。)
新しい/既存のバリデーター ( IntValidatorなど)を試したり、実装したりできIntCtrl
ます。バリデーターは、フィールドを検証するために使用でき (ダイアログ/パネルで複数のものを検証しようとする場合に役立ちます)、フィールドへの入力を制限するために EVT_CHAR と共に使用することもできます。EVT_CHAR
NumCtrl には奇妙な癖があります。これは、EVT_CHAR とキーコードに基づいて Number コントロールを作成しようとする私の試みです。
このコントロールでは、数字だけでなくすべての特殊なキーコード (ctrl コンボ、矢印キー、バックスペースなど) も許可されるため、コピーと貼り付け、元に戻す、やり直し、すべてを選択などは引き続き機能します。他の印刷可能な文字 ( string.printableを使用) と Unicode 文字 ( WXK_NONEを使用)のみをブロックします。
すべての特別なキーコードを確認して許可する別の方法は、この回答で見つけることができます。これはより良いアプローチですが、より多くのコードが必要です。
import string
MyNumCtrl = wx.TextCtrl()
MyNumCtrl.Bind(EVT_CHAR, onChar)
def onChar(self, event):
keycode = event.GetKeyCode()
obj = event.GetEventObject()
val = obj.GetValue()
# filter unicode characters
if keycode == wx.WXK_NONE:
pass
# allow digits
elif chr(keycode) in string.digits:
event.Skip()
# allow special, non-printable keycodes
elif chr(keycode) not in string.printable:
event.Skip() # allow all other special keycode
# allow '-' for negative numbers
elif chr(keycode) == '-':
if val[0] == '-':
obj.SetValue(val[1:])
else:
obj.SetValue('-' + val)
# allow '.' for float numbers
elif chr(keycode) == '.' and '.' not in val:
event.Skip()
return
wxpython デモの「Validator.py」スクリプトを確認してください。それはまさにあなたが必要とするものです