通过一个函数在Kivy中绑定两个TexInput

Bind two TexInput in Kivy through a function

我有两个 TextInput。现在,当我将一个浮点数写入一个时,相同的浮点数出现在另一个中。我现在需要的是另一个浮点数由函数 sp_it 或 it_sp 处理。如何插入函数?

def sp_it(num):
    if num not in range(0,11):
        print "Error!"
    else:
        return ((num-5)*9)/5.0+21

def it_sp(num):
    if num not in range(0,31):
        print "Error!"
    else:
        return ((num-21)*5)/9.0+5

class GradeApp(App):
    def build(self):
        b = BoxLayout(orientation='vertical')
        f = FloatLayout()
        t1 = TextInput(input_filter='float')
        t2 = TextInput(input_filter='float')
        l1 = Label(text='Welcome to Grader!')
        l2 = Label(text='Spanish Grade')
        l3 = Label(text='Italian Grade')
        b.add_widget(l1)
        b.add_widget(l2)
        b.add_widget(t1)
        b.add_widget(l3)
        b.add_widget(t2)
        t1.bind(text=t2.setter('text'))
        return b

if __name__ == '__main__':
    GradeApp().run()

做这样的事情可能很诱人

t1.bind(text=lambda inst, txt: t2.setter('text')(inst, sp_it(txt)))

这适用于一个文本字段,但一旦它变成循环(即添加到 t2 的另一个回调更改 t1),就会中断。 相反,这里我们在文本字段获得焦点时附加文本 属性 处理程序,并在失去焦点时再次将其删除。此外,sp_itit_sp 已清理。

def sp_it(num):
    try:
        num = float(num)
    except ValueError:
        return ""
    if num not in range(0,11):
        return "Error!"
    else:
        return str(((num-5)*9)/5.0+21)

def it_sp(num):
    try:
        num = float(num)
    except ValueError:
        return ""
    if num not in range(0,31):
        return "Error!"
    else:
        return str(((num-21)*5)/9.0+5)

def set_callback(target, modifier, object, text):
    target.text = modifier(text)

def add_callback(inst, focus, target=None, modifier=None):
    if focus:
        inst.fbind('text', set_callback, target, modifier)
    else:
        inst.funbind('text', set_callback, target, modifier)

class GradeApp(App):
    def build(self):
        b = BoxLayout(orientation='vertical')
        f = FloatLayout()
        t1 = TextInput(input_filter='float')
        t2 = TextInput(input_filter='float')
        l1 = Label(text='Welcome to Grader!')
        l2 = Label(text='Spanish Grade')
        l3 = Label(text='Italian Grade')
        b.add_widget(l1)
        b.add_widget(l2)
        b.add_widget(t1)
        b.add_widget(l3)
        b.add_widget(t2)
        t1.fbind('focus', add_callback, target=t2, modifier=sp_it)
        t2.fbind('focus', add_callback, target=t1, modifier=it_sp)
        return b

编辑:解释 set_callback 与我编写的第一个示例中的匿名函数非常相似(除了它需要两个额外的参数,target(其中的 属性 要更改)和 modifier(在传递之前应用于文本的函数))。这样我们就可以为不同的目标等重用这个回调函数。我们这样做的原因是我们稍后想使用 funbind 解除绑定回调。如果我们使用匿名函数,我们将不知道要取消绑定什么。最后,只要 focus 发生变化,就会调用 add_callback。当文本字段获得焦点时,我们将 set_callback 附加到 text 属性,当该字段失去焦点时,我们删除该回调。 (这也意味着如果 text 以编程方式更改,则其他文本字段可能不会自动更新)。 bind/unbindfbind/funbind的详细解释在这里:EventDispatcher