それだけでwxPythonの中の数字を受け入れるようにTextCtrlを制限することは可能ですか?
質問
私は数字だけを受け入れるテキストコントロールを持っていると思います。 (45または366のようなだけの整数値)
は、これを行うための最善の方法は何ですか?
解決
IntCtrl
、Masked Edit Control
、およびNumCtrl
は、すべてのコントロールのさまざまなレベルで、ちょうどこれを行うために設計されています。チェックアウトは、「複数のWindows /コントロール」の下WXデモは、彼らがどのように動作するか確認します。
(または、あなたが代わりに本当に生TextCtrlと直接これを行うことを楽しみにしている場合、私はあなたが、キャッチEVT_CHARイベントにしたいテスト文字、そしてそれが許された場合evt.Skip()を呼び出すと思います文字。)
他のヒント
私は、英数字コードをチェックし、類似した何かをしなければなりませんでした。 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
、EVT_CHAR
を試すことができ、または<のhref = "http://www.wxpython.org/docs/api/wx.lib.intctrl.IntValidator-class.html" のように(新規/既存のバリデータを実装しますrel = "nofollowを"> IntValidator を)。 (ダイアログ/パネル上の複数のものを検証しようとするときに便利)バリデータは、フィールドを検証するために使用することができ、彼らはまた、フィールドに入力を制限するためにEVT_CHARで使用することができます。
他の回答注意点として、それはEVT_CHAR
ハンドラでこれを行うことが可能です。あなたが経由させたい文字にevent.Skip()
を呼び出し、ブロックしたいもののためにそれを呼び出さないことになるでしょう。一つのニュアンスは、おそらくまた、タブ文字のevent.Skip()
を呼び出したいということです。タブを押すとEVT_CHAR
イベントをトリガし、そしてあなたがいないコールevent.Skip()
をすれば、あなたよTextCtrl
sの間に効果的に無効にタブトラバーサルます。
はここで働いてタブトラバーサルで、整数または小数を受け入れる2 TextCtrl
sを示す最小限のアプリケーションがあります:
import wx
app = wx.App()
frame = wx.Frame(None, -1, 'simple.py')
panel = wx.Panel(frame)
text_ctrl_1 = wx.TextCtrl(panel, value='123')
text_ctrl_2 = wx.TextCtrl(panel, value='456', pos=(0, 30))
def block_non_numbers(event):
key_code = event.GetKeyCode()
# Allow ASCII numerics
if ord('0') <= key_code <= ord('9'):
event.Skip()
return
# Allow decimal points
if key_code == ord('.'):
event.Skip()
return
# Allow tabs, for tab navigation between TextCtrls
if key_code == ord('\t'):
event.Skip()
return
# Block everything else
return
text_ctrl_1.Bind(wx.EVT_CHAR, block_non_numbers)
text_ctrl_2.Bind(wx.EVT_CHAR, block_non_numbers)
frame.Show()
app.MainLoop()
NumCtrlは私にいくつかの奇妙な癖を持っています。ここでEVT_CHARとキーコードに基づいて数値制御を作成するための私の試みです。
それはコピー&ペーストしてこのコントロールは、アンドゥ・リドゥ、数字だけでなく、すべての特殊キーコード(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" スクリプトを確認してください。それはあなたが
必要なものを正確に