Как я указывал в моих комментариях, плохая практика программирования - вызывать переменную и функцию с одинаковым именем, поскольку она может скрывать другие свойства
Если перейти к пункту, calendar = ObjectProperty()
не связан ни с чем, что Calendar не связывает с BoxLayout
, это также локальная переменная, жизненный цикл которой заканчивается по завершении конструктора. В вашем случае, когда вы используете self.calendar.add_widget(self.cal)
, self.calendar ссылается на метод календаря, в котором вы его вызываете, и ясно, что имя метода не является виджетом, вызывающим эту ошибку.
Что вы должны сделать, это ObjectProperty
быть свойством класса и назначить его в .kv, в дополнение к изменению имени функции:
Вы должны использовать часы для доступа к виджету, потому что дети еще не установлены в конструкции. В случае Clock
schedule_once это будет впоследствии называться кадром, поэтому у него уже будут дочерние элементы.
*. Py
from kivy.clock import Clock
...
class Reservation(Screen):
calendar = ObjectProperty()
def __init__(self, **kwargs):
super(Reservation, self).__init__(**kwargs)
Clock.schedule_once(lambda *args: self.create_calendar())
def create_calendar(self):
self.cal = CalendarWidget()
self.calendar.add_widget(self.cal)
*. Кв
<Reservation>:
name: "Reserve"
calendar: calendar # set value to ObjectProperty
BoxLayout:
BoxLayout:
id: calendar
BoxLayout:
id: output_box
orientation: 'vertical'