Kivy - 访问 .kv 文件中 ListProperty 的元素
Kivy - Accessing Elements of a ListProperty in .kv file
我已经开始使用 Kivy 编程,这是 Python 中令人惊叹的开源 GUI 库。
我遇到了一个问题close to this topic,但没有令人满意的答案。
我想在我的 .kv 文件中访问附加到我的小部件的 ListProperty 的元素,但出现错误。我想这是对 KV 语法的误解,但我不太明白发生了什么。
更准确地说,我收到以下错误:
- Builder exception: Parser: 在我评论的那一行(见下面的 .kv 文件)
- IndexError: 列表索引超出范围
建造者好像没看懂我的custom_list确实有3个元素,索引从0到2。
这是我为说明情况而编写的简单示例:
example.py 文件
# Kivy modules
import kivy
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.label import Label
from kivy.app import App
from kivy.properties import ListProperty
class MyCustomLabel(Label):
custom_list = ListProperty()
class MainWidget(BoxLayout):
def generate_list(self):
l = ["Hello","Amazing","World"]
my_custom_label = MyCustomLabel()
my_custom_label.custom_list = l
self.add_widget(my_custom_label)
class MyApp(App):
pass
if __name__=="__main__":
MyApp().run()
my.kv 文件
<MainWidget>:
orientation: "vertical"
Button:
# Aspect
text: "CLICK ME"
size_hint_y: None
height: dp(60)
# Event
on_press: root.generate_list()
<MyCustomLabel>:
## This is working
## text: "{}".format(self.custom_list)
## But this is not working... Why ?
text: "{}{}{}".format(self.custom_list[0], self.custom_list[1], self.custom_list[2])
MainWidget:
提前感谢那些愿意花时间回答的人,
男
问题是因为转换列表不完整,因为首先在更改列表之前它是空的导致某些索引不存在,所以一个选择是验证它不是列表或至少是某个列表size,例如有以下2个选项:
text: "{}{}{}".format(self.custom_list[0], self.custom_list[1], self.custom_list[2]) if self.custom_list else ""
text: "{}{}{}".format(self.custom_list[0], self.custom_list[1], self.custom_list[2]) if len(self.custom_list) >= 3 else ""
或者使用 join
是更好的选择:
text: "".join(self.custom_list)
我已经开始使用 Kivy 编程,这是 Python 中令人惊叹的开源 GUI 库。
我遇到了一个问题close to this topic,但没有令人满意的答案。
我想在我的 .kv 文件中访问附加到我的小部件的 ListProperty 的元素,但出现错误。我想这是对 KV 语法的误解,但我不太明白发生了什么。
更准确地说,我收到以下错误:
- Builder exception: Parser: 在我评论的那一行(见下面的 .kv 文件)
- IndexError: 列表索引超出范围
建造者好像没看懂我的custom_list确实有3个元素,索引从0到2。
这是我为说明情况而编写的简单示例:
example.py 文件
# Kivy modules
import kivy
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.label import Label
from kivy.app import App
from kivy.properties import ListProperty
class MyCustomLabel(Label):
custom_list = ListProperty()
class MainWidget(BoxLayout):
def generate_list(self):
l = ["Hello","Amazing","World"]
my_custom_label = MyCustomLabel()
my_custom_label.custom_list = l
self.add_widget(my_custom_label)
class MyApp(App):
pass
if __name__=="__main__":
MyApp().run()
my.kv 文件
<MainWidget>:
orientation: "vertical"
Button:
# Aspect
text: "CLICK ME"
size_hint_y: None
height: dp(60)
# Event
on_press: root.generate_list()
<MyCustomLabel>:
## This is working
## text: "{}".format(self.custom_list)
## But this is not working... Why ?
text: "{}{}{}".format(self.custom_list[0], self.custom_list[1], self.custom_list[2])
MainWidget:
提前感谢那些愿意花时间回答的人,
男
问题是因为转换列表不完整,因为首先在更改列表之前它是空的导致某些索引不存在,所以一个选择是验证它不是列表或至少是某个列表size,例如有以下2个选项:
text: "{}{}{}".format(self.custom_list[0], self.custom_list[1], self.custom_list[2]) if self.custom_list else ""
text: "{}{}{}".format(self.custom_list[0], self.custom_list[1], self.custom_list[2]) if len(self.custom_list) >= 3 else ""
或者使用 join
是更好的选择:
text: "".join(self.custom_list)