Kivy:使用“焦点对准"或"on_touch_down"清除文本输入 [英] Kivy: Clearing Text Input with 'on focus' or 'on_touch_down'

查看:201
本文介绍了Kivy:使用“焦点对准"或"on_touch_down"清除文本输入的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想在单击TextInputtext:时清除它. 示例代码:

I want to clear a TextInput's text: when I click on it. Sample Code:

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()

on_touch_down:on_focus均不会删除当前聚焦的文本输入.相反,当我触摸屏幕上的任意位置时,两者都会被清除.我希望一旦光标位于文本输入上就分别清除它们.我也尝试了on_cursor,但这也不起作用.我想念什么? 提前谢谢!

Neither on_touch_down: or on_focus erases JUST the text input that is currently focused. Instead, both get cleared when I touch anywhere on the screen. I would want them cleared individually once the cursor is on a text input. I also tried on_cursor but that didn't work either. What am I missing? Thank you in advance!

推荐答案

所有小部件都接收on_touch_down事件,直到一个事件返回True告诉事件循环它正在使用它而不将其发送给其他小部件为止如 docs :

The on_touch_down event is received by all the widgets until one returns True telling the event-loop that it is using it and thus not send it to other widgets as indicated by the docs:

on_touch_down(触摸)在1.0.0版中添加

on_touch_down(touch) Added in 1.0.0

接收降落事件.

参数:

触摸: MotionEvent类已收到触摸.

touch: MotionEvent class Touch received.

触摸位于父坐标中.有关坐标的讨论,请参见relativelayout 系统.

The touch is in parent coordinates. See relativelayout for a discussion on coordinate systems.

返回:

bool如果为True,则将停止调度touch事件. 如果为False,则事件将继续分配给其他 小部件树.

bool If True, the dispatching of the touch event will stop. If False, the event will continue to be dispatched to the rest of the widget tree.

on_touch_down的经典用法是在python中使用,因为kv语言在方法的覆盖方面受到限制:

The classic use of on_touch_down is in python since kv language is limited in the overwriting of methods:

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()

或.kv中的等效项,但最糟糕的是您无法返回True.

Or something equivalent in .kv but the devestaja is that you can not return 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 = ""
"""

因此,您应该使用on_focus,它是与FocusBehavior关联的事件,该事件会覆盖使用self.collide_point(*touch.pos)进行的on_touch_down验证.

So you should use on_focus which is an event associated to FocusBehavior that overwrites on_touch_down verifying using 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()

这篇关于Kivy:使用“焦点对准"或"on_touch_down"清除文本输入的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆