kivy:如何在 TextIput 小部件上添加对 unfocus 事件的回调
kivy: How to add a callback to a unfocus event on TextIput widgets
我在将回调函数绑定到 TextInput 的 on_focus
事件时遇到问题。
我希望它在输入小部件的焦点被移除时触发验证事件。并且,在这样做时,调用另一个方法(通过 on_validate_text
方法)
代码如下:
from kivy.uix.gridlayout import GridLayout
from kivy.uix.label import Label
from kivy.uix.textinput import TextInput
from kivy.uix.popup import Popup
from kivy.uix.button import Button
from kivy.app import App
class MyTextInput(TextInput):
def __init__(self, **kwargs):
super().__init__(**kwargs)
self.multiline = False
self.unfocus_on_touch = True
def on_focus(self, instance, value):
if not value: # DEFOCUSED
print('Focus is off')
class MainLayout(GridLayout):
def __init__(self, **kwargs):
super().__init__(**kwargs)
self.cols = 2
#First row
self.top_label = Label(text = 'No text')
self.add_widget(self.top_label)
self.top_input = MyTextInput(on_text_validate=self.change_top_label)
#Here im trying to trigger the validate event when the on_focus gets called
self.top_input.bind(on_focus=self.top_input.on_text_validate)
self.add_widget(self.top_input)
#Second row
self.bottom_label = Label(text='Bottom Label')
self.add_widget(self.bottom_label)
self.bottom_input = MyTextInput(on_text_validate=self.create_popup)
self.bottom_input.bind(on_focus=self.bottom_input.on_text_validate)
self.add_widget(self.bottom_input)
def change_top_label(self, instance):
self.top_label.text = instance.text
instance.text = ''
def create_popup(self, instance):
self.my_popup = Popup(title=instance.text, size_hint=(.5, .5))
self.my_popup.content = Button(text='CLOSE', on_release=self.my_popup.dismiss)
self.my_popup.open()
instance.text = ''
if __name__ == '__main__':
class MainApp(App):
def build(self):
return MainLayout()
MainApp().run()
在这种情况下,当顶部输入散焦时,我希望它通过验证事件调用 change_top_label
方法。
同样,当底部输入散焦时,应该通过验证事件调用 create_popup
方法。
我需要两个输入,以便在注意力不集中时调用回调函数。但是我无法在 on_focus
方法中定义该函数,因为它需要对于 MyTextInput 的每个实例都不同。
我试过将 on_text_validate
绑定到 on_focus
,并在 on_focus
方法中调用 on_text_validate
,但它不起作用。
显然我缺少一些东西。
如果你能帮我解决这个问题,那就太好了。
首先,您的代码似乎已经在执行以下操作(在调用方法 on_text_validate
之后),
In this case, when de top input gets defocused, I want it to call the change_top_label method through the validation event...
其次,
I've tried binding on_text_validate to on_focus...
这让我感到困惑。当您点击 'enter' 时(如果 multiline
设置为 False
),方法 on_text_validate
被调用,这也会使 TextInput
失去焦点。 on_focus
也是一种默认方法,每当 attr. focus
变化。最后,如果您只想要这个,
I need both input to call a callback function when unfocused. But...
你可以这样做 TextInput_instance.bind(focus = some_method)
。
我在将回调函数绑定到 TextInput 的 on_focus
事件时遇到问题。
我希望它在输入小部件的焦点被移除时触发验证事件。并且,在这样做时,调用另一个方法(通过 on_validate_text
方法)
代码如下:
from kivy.uix.gridlayout import GridLayout
from kivy.uix.label import Label
from kivy.uix.textinput import TextInput
from kivy.uix.popup import Popup
from kivy.uix.button import Button
from kivy.app import App
class MyTextInput(TextInput):
def __init__(self, **kwargs):
super().__init__(**kwargs)
self.multiline = False
self.unfocus_on_touch = True
def on_focus(self, instance, value):
if not value: # DEFOCUSED
print('Focus is off')
class MainLayout(GridLayout):
def __init__(self, **kwargs):
super().__init__(**kwargs)
self.cols = 2
#First row
self.top_label = Label(text = 'No text')
self.add_widget(self.top_label)
self.top_input = MyTextInput(on_text_validate=self.change_top_label)
#Here im trying to trigger the validate event when the on_focus gets called
self.top_input.bind(on_focus=self.top_input.on_text_validate)
self.add_widget(self.top_input)
#Second row
self.bottom_label = Label(text='Bottom Label')
self.add_widget(self.bottom_label)
self.bottom_input = MyTextInput(on_text_validate=self.create_popup)
self.bottom_input.bind(on_focus=self.bottom_input.on_text_validate)
self.add_widget(self.bottom_input)
def change_top_label(self, instance):
self.top_label.text = instance.text
instance.text = ''
def create_popup(self, instance):
self.my_popup = Popup(title=instance.text, size_hint=(.5, .5))
self.my_popup.content = Button(text='CLOSE', on_release=self.my_popup.dismiss)
self.my_popup.open()
instance.text = ''
if __name__ == '__main__':
class MainApp(App):
def build(self):
return MainLayout()
MainApp().run()
在这种情况下,当顶部输入散焦时,我希望它通过验证事件调用 change_top_label
方法。
同样,当底部输入散焦时,应该通过验证事件调用 create_popup
方法。
我需要两个输入,以便在注意力不集中时调用回调函数。但是我无法在 on_focus
方法中定义该函数,因为它需要对于 MyTextInput 的每个实例都不同。
我试过将 on_text_validate
绑定到 on_focus
,并在 on_focus
方法中调用 on_text_validate
,但它不起作用。
显然我缺少一些东西。
如果你能帮我解决这个问题,那就太好了。
首先,您的代码似乎已经在执行以下操作(在调用方法 on_text_validate
之后),
In this case, when de top input gets defocused, I want it to call the change_top_label method through the validation event...
其次,
I've tried binding on_text_validate to on_focus...
这让我感到困惑。当您点击 'enter' 时(如果 multiline
设置为 False
),方法 on_text_validate
被调用,这也会使 TextInput
失去焦点。 on_focus
也是一种默认方法,每当 attr. focus
变化。最后,如果您只想要这个,
I need both input to call a callback function when unfocused. But...
你可以这样做 TextInput_instance.bind(focus = some_method)
。