通过一个函数在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_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。
【讨论】:
效果很好!但是你能解释一下你用 set:_callback 和 add_callback 做了什么吗?以上是关于通过一个函数在Kivy中绑定两个TexInput的主要内容,如果未能解决你的问题,请参考以下文章