#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')