调用小部件
有些时候,获取在特定的小部件树中的其他小部件是必要的。在kv语言中,有一个方法做这样的事情,使用IDs。
【做好准备】
在这一道做法中,我们将使用两个普通的小部件作为调用。按钮和文本输出框是非常普通的小部件。
【怎样做?】
具体的食谱按照以下的做法:
1.确定一个规则。
2.建立id。
3. Call the ID:
3.召唤id:
<MyWidget>:
Button:
id: f_but
TextInput:
text: f_but.state
【他是怎样运行的?】
Let's see the code; this is the first line:
让我们看看代码,下面的这是第一行代码:
<MyWidget>:
这是我们即将要使用的小部件的名称,这是一个可以点击的文本输入框。#这里可能是一个错误,我认为这儿只是一个小部件的区域容器表示。可能原文的作者在这里表达错误了。
这第二行的代码是:
Button:
这里定义了一个按钮。
这第三行的代码是:
id: f_but
这里给按钮一个叫做f_but的ID,我们可以使用它来调用这个按钮。
这第四行是:
TextInput:
这里定义了文本输入框。
这第五行代码是:
text: f_but.state
这里是定义文本输入框里面的文字。我们通过这个文本框来调用按钮的状态。
也就是说,如果你不点击按钮的话,那么在文本输入框里的文字就是默认的,如果你点击的按钮,那么在文本输入框中的文字就会被展示。
【还有更多】
Id是被限制在他所声明的规则的范围之内,所以在之前的代码中,f_but是不能够在<MyWidget>之外被获取的,也就是说,如果我们有第二个<MyWidget2>,我们是不能够在<MyWidget2>其中来调用f_but。
ID也是小部件的弱引用模块,而不是小部件本身。因此,存储ID不足以防止小部件被垃圾收集。
演示:
<MyWidget>:
label_widget: label_widget.__self__
Button:
text: 'Add Button'
on_press: root.add_widget(label_widget)
Button:
text: 'Remove Button'
on_press: root.remove_widget(label_widget)
Label:
id: label_widget
text: 'widget'
如果我们不使用ID.__self__,具体在这种情况下,也就是label_widget.__self,而只是label_ widget的话,我们将获取错误:调用错误:弱引用的控件不再存在(weakly-referenced object no longer exists)。
【再看看】
如果你想要得到更多的关于小部件的细节,看一看第四章,小部件。