2013-07-24 2 views
3

TextInput 님이 제한된 문자열 값 (즉, 최대 길이 x의 문자열)을 수신 할 수있는 방법이 있습니까? 나는 을 모방하기 위해 AliasProperty을 mixin하는 방법을 조사했지만 Property 클래스 메쏘드를 찾을 수 없다.Kivy : TextInputs에 "BoundedString"속성을 사용할 수 있습니까?

+0

Y는 'insert_text'를 무시하고 TextInput에 입력 된 텍스트를이 방식으로 제한하지 않습니까? –

답변

6

시간은 on_text라고 부르며 텍스트는 이미 textinput에서 변경됩니다. insert_text을 재정 의하여 TextInput에 삽입하기 전에 텍스트를 잡아서 text 속성이 업데이트되기 전에 TextInput에 항목을 제한해야합니다.

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) 
+0

바퀴를 재발 명하려고하지 마세요. 감사! –

2

텍스트를 수정할 때마다 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

의 코드, 당신은 당신이 이미 이전에 언급 한 on_text 이벤트를 트리거 StringProperty을 얻었다 년부터 AliasProperty를 사용하려고 시도해서는 안된다.

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) 

i는 init에 키워드 인수로 max_chars를 전달합니다. NumericProperty 대신 max_chars에 대해 int를 그냥 사용하는 경우