我在kivy有一个使用许多标签的应用程序。是否有可能从列表中获取它们的值?例如(但这不起作用)
Label:
text:root.label_value[0]
Label:
text:root.label_value[1]
答案 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
通过这种方式,您几乎可以访问任何内容,因为您可以从可以轻松访问的地方保存要访问的对象。