Kivy:TextInputs是否有“BoundedString”属性?

时间:2013-07-24 17:03:59

标签: python kivy

TextInput是否有办法接收有界字符串值(即最大长度为x的字符串)?我尝试调查如何混合AliasProperty以模仿BoundedNumericProperty,但找不到任何Property类方法。

3 个答案:

答案 0 :(得分:7)

当调用on_text时,textinput中的文本已经更改。您希望覆盖insert_text以在文本插入TextInput之前捕获文本,因此在更新text属性之前将文本限制为TextInput。

请不要绑定/请求键盘,因为textinput会为你做这件事,你的处理程序将在Textinput聚焦后停止工作(TextInput将请求键盘,在单个键盘环境中你的处理程序将停止工作)。 / p>

这是一个覆盖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)

答案 1 :(得分: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_textmy_callback中的文本变量,则可能会在之前触发事件。老实说,我不记得了,但我认为确实如此,所以在修改变量

之前需要一个标志,例如验证

您还可以使用仍然使用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)

最后,您还可以bind the keyboard,这样您就可以保证TextInput之前的访问权限。老实说,我不知道执行的顺序,但是如果你使用on_text,你可能会在屏幕上显示的字母后​​删除,这可能是不可取的。

我认为实现你自己的BoundedStringProperty将是一项很有意义的工作来实现你想要的。以下是BoundedNumericProperty

的代码

此外,您不应该尝试使用AliasProperty,因为您已经StringProperty触发了之前提及的on_text事件。

答案 2 :(得分: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。 如果我只使用int for max_chars而不是NumericProperty

,这是有效的