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

Posted

技术标签:

【中文标题】通过一个函数在Kivy中绑定两个TexInput【英文标题】:Bind two TexInput in Kivy through a function 【发布时间】:2016-05-08 13:31:35 【问题描述】:

我有两个文本输入。现在,当我将一个浮点数写入一个时,相同的浮点数会出现在另一个中。我现在需要的只是让另一个浮点数由函数 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()

【问题讨论】:

【参考方案1】:

这样做可能很诱人

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。

【讨论】:

效果很好!但是你能解释一下你用 set:_callback 和 add_callback 做了什么吗?

以上是关于通过一个函数在Kivy中绑定两个TexInput的主要内容,如果未能解决你的问题,请参考以下文章

如何将参数传递给 kivy 按钮的绑定函数

kivy中bind的使用

将 Kivy 列表项中的 on_release 绑定到函数

将函数绑定到kivy中的按钮

Kivy 使用两个文件 .kv

Kivy - 如何在激活时将功能绑定到复选框