Kivy:使用“on focus"或“on_touch_down"清除文本输入
问题描述
我想在单击 TextInput
的 text:
时清除它.示例代码:
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 告诉事件循环它正在使用它,因此没有将其发送到 文档:
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(touch) 在 1.0.0 中添加
on_touch_down(touch) Added in 1.0.0
接收触地事件.
参数:
touch: MotionEvent 类 Touch 收到.
touch: MotionEvent class Touch received.
触摸在父坐标中.有关坐标的讨论,请参见 relativelayout系统.
The touch is in parent coordinates. See relativelayout for a discussion on coordinate systems.
返回:
bool 如果为 True,则触摸事件的调度将停止.如果为 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
关联的事件,它会覆盖 on_touch_down
使用 self.collide_point(*touch.pos)
进行验证.
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()
相关文章