Kivy для Python: сброс фокуса после проверки или фиксация фокуса на поле ввода текста

#python #kivy #focus

#python #kivy #фокус

Вопрос:

Я работаю над приложением для выполнения в Kivy: у меня есть поле ввода текста для ввода задачи. После этого я подтверждаю ввод. Нажатие Enter вызывает мою функцию «Подтвердить» с помощью встроенной функции проверки текста Kivys. Эта функция «Подтверждения» очищает поле ввода, создает кнопку ниже, которая показывает задачу. Если кнопка нажата, она удаляется сама.

Вот моя проблема: после проверки моего ввода нажатием Enter поле ввода текста теряет фокус. Мне пришлось бы щелкнуть в поле ввода текста, чтобы ввести вторую задачу, что довольно неудобно. Я хочу, чтобы поле ввода текста всегда сохраняло фокус.

Я попытался сбросить фокус, включив text_input.focus = True в свою функцию подтверждения. Это не сработало.

Я также пытался использовать Kivys clock для вызова text_input.focus = True каждые 0,5 секунды. Это тоже не сработало.

Как правило, я, похоже, не могу установить фокус с помощью text_input.focus = True .

Я бы хотел найти решение либо

  1. сброс фокуса на мое поле ввода текста при проверке моего ввода или
  2. заблокируйте фокус на моем поле ввода текста.

Я приведу свой код ниже. Спасибо!

 import kivy      

kivy.require('1.9.0')  

from kivy.app import App  
from kivy.uix.label import Label
from kivy.uix.button import Button  
from kivy.uix.textinput import TextInput 
from kivy.uix.gridlayout import GridLayout

class MyTextInput(TextInput):
    def on_parent(self, widget, parent):
        self.focus = True

# Create the App class 
class TutorialApp(App): 
      
    def build(self):
        def confirm(self):
            todo_element = Button(
                text = text_input.text,
                on_press = remove)
            grid.add_widget(todo_element)
            text_input.text = ""
            #text_input.focus = True

        def remove(self):
            self.parent.remove_widget(self)

        grid = GridLayout(
            cols = 1,
            row_default_height = 30,
            row_force_default = True)

        text_input = MyTextInput(
            text ="",
            multiline = False,
            on_text_validate = confirm)

        grid.add_widget(text_input)

        return grid
            
# Run the App 
if __name__ == "__main__": 
    TutorialApp().run() 
  

Ответ №1:

Это свойство TextInput , которое делает то, что вы хотите. Смотрите документацию. Свойство является text_validate_unfocus . Таким образом, вы можете изменить свое создание MyTextInput экземпляра, чтобы использовать это свойство:

     text_input = MyTextInput(
        text ="",
        multiline = False,
        text_validate_unfocus = False,
        on_text_validate = confirm)
  

Комментарии:

1. Спасибо! Я почему-то этого не нашел.