3

TextInputs が限定された文字列値 (つまり、最大長 x の文字列) を受け取る方法はありますか? AliasPropertyを模倣するために mixin する方法を調べてみましBoundedNumericPropertyたが、Property クラスのメソッドが見つかりません。

4

3 に答える 3

7

が呼び出されるまでに、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)
于 2013-07-25T09:57:05.310 に答える
3

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を既に取得しているため、 を使用しようとするべきではありません。StringPropertyon_text

于 2013-07-25T05:58:06.340 に答える
1

上記のコードには単純な問題があります。コードを使用するには、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 のみを使用する場合に機能します

于 2016-03-10T14:03:11.940 に答える