киви: Точное размещение курсора фокусировки между символами в виджете

#python #kivy

Вопрос:

Как я могу изменить фокус курсора между символами ? Мой виджет добавляется / , чтобы помочь записать дату, но фокус курсора остается за / символом, который я добавил. Я хотел бы продвинуть это вслед за персонажем.

MVP:

 from kivy.app import App
from kivy.uix.textinput import TextInput

def on_text(instance, value):
    if len(value) == 2:
        if value[:2].isdigit():
            instance.text  = "/"
    if len(value) == 5:
        if value[3:5].isdigit():
            instance.text  = "/"
    print('The widget', instance, 'have:', value)

class MyApp(App):
    def build(self):
        text_input = TextInput()
        text_input.bind(text=on_text)
        return text_input

MyApp().run()
 

Ответ №1:

Более чистый подход состоит в том, чтобы просто обойти insert_text() метод TextInput . Вот измененная версия вашего кода, которая делает это:

 from kivy.app import App
from kivy.uix.textinput import TextInput

class MyTextInput(TextInput):
    def insert_text(self, substring, from_undo=False):
        value = self.text   substring
        if len(value) == 2:
            if value[:2].isdigit():
                substring  = "/"
        if len(value) == 5:
            if value[3:5].isdigit():
                substring  = "/"
        return super(MyTextInput, self).insert_text(substring, from_undo=from_undo)

class MyApp(App):
    def build(self):
        text_input = MyTextInput()
        # text_input.bind(text=on_text)
        return text_input

MyApp().run()
 

Обратите внимание, что использование on_text() метода для изменения text результатов в дополнительных вызовах on_text() и может легко привести к бесконечному циклу.