TextInput
s が限定された文字列値 (つまり、最大長 x の文字列) を受け取る方法はありますか? AliasProperty
を模倣するために mixin する方法を調べてみましBoundedNumericProperty
たが、Property クラスのメソッドが見つかりません。
3 に答える
が呼び出されるまでに、on_text
テキストはすでにテキスト入力で変更されています。エントリを TextInput に制限するために、テキストプロパティが更新される前に、テキストが TextInput に挿入される前にテキストをキャッチするために、insert_textをオーバーライドする必要があります。
キーボードをバインド/リクエストしないでください。textinput がそれを行うため、ハンドラーは Textinput がフォーカスされた後に動作を停止します (TextInput はキーボードをリクエストし、単一のキーボード環境ではハンドラーは動作を停止します)。
以下は、insert_text をオーバーライドしてテキスト テキスト入力を数値入力のみに制限するサンプル コードです。
class NumericInput(TextInput):
def insert_text(self, substring, from_undo=False):
if not from_undo:
try:
int(substring)
except ValueError:
return
super(NumericInput, self).insert_text(substring, from_undo)
したがって、テキストを特定の長さに制限するには、次のようにします。
class CustomInput(TextInput):
max_chars = NumericProperty(10)
def insert_text(self, substring, from_undo=False):
if not from_undo and (len(self.text)+len(substring) > self.max_chars):
return
super(CustomInput, self).insert_text(substring, from_undo)
on_text
テキストを変更するたびにイベントがトリガーされると思います。したがって、メソッドをオーバーライドできます。
def on_text(self, instance, value):
print('The widget', instance, 'have:', value)
# validate here!!!
# you might also want to call the parent.
#super(ClassName, self).on_text(instance, value)
またはそれをバインドします:
def my_callback(instance, value):
print('The widget', instance, 'have:', value)
#validate here
textinput = TextInput()
textinput.bind(text=my_callback)
不定再帰には注意してください。内部のテキスト変数を変更した場合、on_text
またはmy_callback
前にイベントをトリガーしている可能性があります。正直覚えていませんが、あると思いますので、変数を変更する前に検証などのフラグが必要です
still use を使用して、いつフォーカスが失われたon_focus
かを確認することもできます。TextInput
def on_focus(instance, value):
if value:
print('User focused', instance)
else:
print('User defocused', instance)
textinput = TextInput()
textinput.bind(focus=on_focus)
最後に、キーボードをバインドすることもできるので、TextInput
. 正直なところ、実行の順序はわかりませんが、使用on_text
すると、画面に表示された文字の後に削除される可能性があり、望ましくない場合があります.
独自のものを実装するBoundedStringProperty
ことは、あなたが望むものを達成するためのかなりの作業になると思います. これがのコードですBoundedNumericProperty
また、前述のイベントをトリガーするAliasProperty
を既に取得しているため、 を使用しようとするべきではありません。StringProperty
on_text
上記のコードには単純な問題があります。コードを使用するには、NumericProperty.defaultvalue を使用する必要があります (長さの比較で)。以下は、適切と思われる任意のサイズのクラスを作成するために使用できる単純な子クラスです。
class CustomInput(TextInput):
def __init__(self , **kwargs):
if "max_chars" in kwargs:
self.max_chars = NumericProperty(int(kwargs["max_chars"]))
super(CustomInput , self ).__init__(**kwargs)
def insert_text( self , substring , from_undo = False ):
if not from_undo and ( len( self.text ) + len( substring ) > self.max_chars.defaultvalue ):
return
super( CustomInput , self).insert_text( substring , from_undo)
キーワード引数として max_chars を init に渡します。これは、NumericProperty の代わりに max_chars に int のみを使用する場合に機能します