TextInput
是否有办法接收有界字符串值(即最大长度为x的字符串)?我尝试调查如何混合AliasProperty
以模仿BoundedNumericProperty
,但找不到任何Property类方法。
答案 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_text
或my_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
,这是有效的