Kivy:使用“焦点对准"或"on_touch_down"清除文本输入 [英] Kivy: Clearing Text Input with 'on focus' or '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告诉事件循环它正在使用它而不将其发送给其他小部件为止如 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屋!