通过一个函数在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_it
和 it_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
/unbind
和fbind
/funbind
的详细解释在这里:EventDispatcher。
我有两个 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_it
和 it_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
/unbind
和fbind
/funbind
的详细解释在这里:EventDispatcher。