Kivy: Borrado de la entrada de texto con ‘on focus’ o ‘on_touch_down’

Quiero borrar el texto de un TextInput text: cuando hago clic en él. Código de muestra:

 from kivy.app import App from kivy.lang import Builder kv_string = """ ScreenManager: id: manager Screen: BoxLayout: orientation: 'vertical' Button: text: 'Why does it clear multiple inputs? And why do they get cleared after touch_up?' TextInput: text: 'Write Your Name' on_touch_down: self.text = '' TextInput: text: 'Write Your Last Name' on_focus: self.text = '' TextInput: text: 'Write Your Phone Number' on_touch_down: self.text = '' """ class MyApp(App): def build(self): root_widget = Builder.load_string(kv_string) return root_widget if __name__ == "__main__": MyApp().run() 

Ni on_touch_down: ni on_focus borran SOLO la entrada de texto que está enfocada actualmente. En su lugar, ambos se borran cuando toco cualquier parte de la pantalla. Me gustaría que se borren individualmente una vez que el cursor está en una entrada de texto. También probé con el on_cursor pero tampoco funcionó. ¿Qué me estoy perdiendo? ¡Gracias de antemano!

El evento on_touch_down es recibido por todos los widgets hasta que uno devuelve True diciendo al ciclo de eventos que lo está utilizando y, por lo tanto, no lo envía a otros widgets como lo indica la documentación :

on_touch_down (táctil) Añadido en 1.0.0

Recibe un evento de aterrizaje.

Parámetros:

toque: clase MotionEvent toque recibido.

El toque está en las coordenadas de los padres. Vea relativelayout para una discusión sobre sistemas de coordenadas.

Devoluciones :

bool Si es verdadero, se detendrá el envío del evento táctil. Si es False, el evento continuará siendo distribuido al rest del árbol de widgets.

El uso clásico de on_touch_down es en python ya que el lenguaje kv está limitado en la sobrescritura de métodos:

 from kivy.app import App from kivy.lang import Builder from kivy.uix.textinput import TextInput class MyTextInput(TextInput): def on_touch_down(self, touch): if self.collide_point(*touch.pos): self.text = "" return True return super(MyTextInput, self).on_touch_down(touch) kv_string = """ ScreenManager: id: manager Screen: BoxLayout: orientation: 'vertical' Button: text: 'Why does it clear multiple inputs? And why do they get cleared after touch_up?' MyTextInput: text: 'Write Your Name' MyTextInput: text: 'Write Your Last Name' MyTextInput: text: 'Write Your Phone Number' """ class MyApp(App): def build(self): root_widget = Builder.load_string(kv_string) return root_widget if __name__ == "__main__": MyApp().run() 

O algo equivalente en .kv pero el devestaja es que no puedes devolver True.

 kv_string = """ ScreenManager: id: manager Screen: BoxLayout: orientation: 'vertical' Button: text: 'Why does it clear multiple inputs? And why do they get cleared after touch_up?' TextInput: text: 'Write Your Name' on_touch_down: if self.collide_point(*args[1].pos): self.text = "" TextInput: text: 'Write Your Last Name' on_touch_down: if self.collide_point(*args[1].pos): self.text = "" TextInput: text: 'Write Your Phone Number' on_touch_down: if self.collide_point(*args[1].pos): self.text = "" """ 

Por lo tanto, debe usar on_focus, que es un evento asociado a FocusBehavior que sobrescribe on_touch_down verifica el uso de self.collide_point(*touch.pos) .

 from kivy.app import App from kivy.lang import Builder kv_string = """ ScreenManager: id: manager Screen: BoxLayout: orientation: 'vertical' Button: text: 'Why does it clear multiple inputs? And why do they get cleared after touch_up?' TextInput: text: 'Write Your Name' on_focus: self.text = "" TextInput: text: 'Write Your Last Name' on_focus: self.text = "" TextInput: text: 'Write Your Phone Number' on_focus: self.text = "" """ class MyApp(App): def build(self): root_widget = Builder.load_string(kv_string) return root_widget if __name__ == "__main__": MyApp().run()