Python 的 Kivy:验证后重置焦点或将焦点锁定到文本输入字段

Kivy for Python: Resetting focus after validation or locking focus to a text input field

我正在 Kivy 开发一个 To Do-App:我有一个文本输入字段可以输入任务。然后,我按 Enter 确认。按 Enter 键会引发我的“确认”功能,其中包含 Kivys 内置的 on-text-validate-Function。这个“确认”-函数清除输入字段,在下面创建一个按钮,显示任务。如果按下按钮,它会自行删除。

这是我的问题: 按 Enter 确认我的输入后,文本输入字段失去焦点。我必须单击文本输入字段才能键入第二个任务,这非常不方便。 我希望文本输入字段始终保持焦点。

我试图通过在我的确认函数中包含一个 text_input.focus = True 来重置焦点。这没有用。

我还尝试使用 Kivys 时钟每 0.5 秒调用一次 text_input.focus = True。这也没有用。

一般来说,我好像无法通过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() 

TextInput 中的 属性 可以满足您的需求。参见documentation。 属性 是 text_validate_unfocus。因此,您可以更改 MyTextInput 实例的创建以使用此 属性:

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