それだけでwxPythonの中の数字を受け入れるようにTextCtrlを制限することは可能ですか?

StackOverflow https://stackoverflow.com/questions/1369086

  •  21-09-2019
  •  | 
  •  

質問

私は数字だけを受け入れるテキストコントロールを持っていると思います。 (45または366のようなだけの整数値)

は、これを行うための最善の方法は何ですか?

役に立ちましたか?

解決

IntCtrlMasked 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()
あなたはIntCtrlEVT_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()をすれば、あなたよTextCtrlsの間に効果的に無効にタブトラバーサルます。

はここで働いてタブトラバーサルで、整数または小数を受け入れる2 TextCtrlsを示す最小限のアプリケーションがあります:

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" スクリプトを確認してください。それはあなたが

必要なものを正確に
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top