Kivy - Доступ к элементам ListProperty в файле.kv
Я начал программировать с Kivy, удивительной библиотекой GUI с открытым исходным кодом на Python.
Я столкнулся с проблемой, близкой к этой теме, но она не имеет удовлетворительного ответа.
Я хочу получить доступ к элементам ListProperty, прикрепленным к моему виджету, в моем файле.kv, но я получаю ошибку. Я предполагаю, что это происходит из-за неправильного понимания синтаксиса KV, но я не могу понять, что происходит.
Точнее, я получаю следующую ошибку:
- Исключение Builder: 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:
Заранее спасибо тем, кто найдет время ответить,
M
1 ответ
Проблема вызвана тем, что список переходов не является полным, потому что сначала перед изменением списка он пуст, в результате чего определенный индекс не существует, поэтому один из вариантов - убедиться, что это не список или, по крайней мере, определенного размера. Например, Есть следующие 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)