是否可以在kivy中使用标签列表

时间:2016-06-14 08:44:31

标签: kivy

我在kivy有一个使用许多标签的应用程序。是否有可能从列表中获取它们的值?例如(但这不起作用)

        Label:
            text:root.label_value[0]
        Label:
            text:root.label_value[1]

3 个答案:

答案 0 :(得分:2)

是的,快速示例

from kivy.app import App

from kivy.uix.boxlayout import BoxLayout
from kivy.lang import Builder
from kivy.properties import ListProperty


Builder.load_string("""
<Test>:
    Label:
        text:root.label_value[0]
    Label:
        text:root.label_value[1]
""")

class Test(BoxLayout):

    label_value = ListProperty(["crazy", 'cheese'])

    def __init__(self, **kw):
        super(Test, self).__init__(**kw)
        self.label_value = ["crazy2", 'cheese2']





class TestApp(App):
    def build(self):
        return Test()

TestApp().run()

答案 1 :(得分:1)

是的,你可以。列表可以包含任何类型的对象。请考虑以下代码:

from kivy.uix.label import Label
from kivy.uix.gridlayout import GridLayout

labels = []
for i in range(10):
    labels.append(Label(text = str(i)))

现在您有一个包含10个标签的列表,这些标签在列表中的位置都是文本。创建列表后,您可以像平常一样访问它。以下代码采用上一个示例中的标签并将它们添加到网格布局中:

layout = GridLayout(cols=1)
for item in labels:
    layout.add_widget(item)

我希望这能回答你的问题。

答案 2 :(得分:1)

虽然有可用的答案,但我希望这会向您展示另一种,希望更漂亮和/或更有效的方法。

当每个小部件作为子级添加到另一个小部件时,它将出现在<widget>.children中,即以这种方式工作的对象的列表

<widget>.children = [last_added, added before the `last_added` one, etc...]

通过这种方式,您不需要任何其他变量来获取/设置小部件的值。您可以在id文件中设置kv或在变量中使用父对象(窗口小部件),以便您可以这样做:

print my_parent.children[0].text
print self.ids.my_parent.children[0].text

这基本上是@Alan的用途,但没有不必要的变量 - 您可以使用for添加它们,然后从现有列表中访问。

@Yoav在__init__中设置它,但您依赖于该列表,这意味着要添加另一个Label,您需要更新该列表。或者相反 - 附加函数on_label_value(),它将检查长度并添加新窗口小部件或删除窗口小部件if len(new_label_value) != len(label_value)或类似情况,如果新窗口等于列表的旧长度,然后什么都不做这只会使事情大规模复杂化。

如果您有很多(嵌套)小部件,那么您的语句将变为 long ,但是有很多方法可以将它们缩短,例如:使用ObjectProperty并将其设置为kv或使用App类中的其他属性,例如:

# python
app = App.get_running_app()
app.my_parent = self

# kv
app.my_parent # because in kv you have access to `App` with `app` keyword

通过这种方式,您几乎可以访问任何内容,因为您可以从可以轻松访问的地方保存要访问的对象。