問題描述
我想在單擊 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()
這篇關于Kivy:使用“on focus"或“on_touch_down"清除文本輸入的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網!