Я не могу получить доступ к «Корню» моего кода Kivy

#python-3.x #kivy

#python-3.x #kivy

Вопрос:

Я создал код, в котором есть корневой класс «Screen», а на стороне файла.kv есть «ScrollView» с «Списком». В файле .py я создал цикл, который создает несколько кнопок в списке self.ids.scroll, используя add_widget и Builder для создания виджета:

 Class Main(Screen):
    def test(self):
        print("Ok")

    def updatelist(self):
        for i in range(10):
            self.ids.scroll.add_widget(Builder.load_string(
            f"""Button:
                    text: str({i})
             """
                )
            )
 

Проблема в том, что когда я пытаюсь создать on_release внутри кнопки:

 on_release: root.test()
 

Он возвращает ошибку, сообщая, что «Button» не имеет функции «test», то есть он не находит корень, «Основной» класс, в котором находится функция, он ограничен только самим собой.
Я попытался создать кнопки без использования «Builder», просто используя:

 for i in range(10):
    self.ids.scroll.add_widget(Button())
 

Но у меня были проблемы, например, с захватом его self.text, потому что это возможно только с помощью языка Kv.

Любая помощь, спасибо!

Ответ №1:

Вы должны ссылаться на текущее запущенное приложение на языке kv, иначе оно будет искать внутри класса Button.

Для ссылки на ваш основной класс используйте:
on_release: app.root.test()

Комментарии:

1. Большое вам спасибо, друг, эта проблема (которая кажется простой) вызвала несколько других проблем в моем коде, спасибо за время 🙂

2. Эй, у меня похожая проблема… Я создал ScreenManager и добавил экраны, но в .py я не могу получить доступ к этим классам экранов, вы можете мне помочь? Я не могу создать новый вопрос.

3. Не могу быть уверен без дополнительной информации. Но в .py файле вы должны сделать что-то вроде: App.get_running_app().root.get_screen('screenname')