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)