Kivy - Доступ к элементам ListProperty в файле .kv - PullRequest
0 голосов
/ 09 октября 2018

Я начал программировать с Kivy, удивительной библиотекой GUI с открытым исходным кодом на Python.

Я столкнулся с проблемой , близкой к этой теме , но она не имеет удовлетворительного ответа.

Я хочу получить доступ к элементам ListProperty, прикрепленным к моему виджету, в моем файле .kv, но я получаю ошибку.Я предполагаю, что это происходит из-за неправильного понимания синтаксиса KV, но я не могу точно понять, что происходит.

Точнее, я получаю следующую ошибку:

  • Исключение Builder: Parser: onстрока, которую я прокомментировал (см. ниже файл .kv)
  • IndexError: список индексов вне диапазона

Это как если бы конструктор не понял, что мой custom_list *У 1018 * действительно есть 3 элемента, проиндексированных от 0 до 2.

Вот простой пример, который я кодировал, чтобы проиллюстрировать ситуацию:

example.py file

# 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 file

<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 Ответ

0 голосов
/ 09 октября 2018

Проблема вызвана тем, что список переходов не является полным, потому что сначала перед изменением списка он пуст, в результате чего определенный индекс не существует, поэтому один из вариантов - убедиться, что это не список или, по крайней мере, определенного размера,Например, есть следующие 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)
...