Календарь Kivy: Как вставить Календарь Kivy в BoxLayout и установить функцию в его кнопках - PullRequest
0 голосов
/ 03 мая 2018

[отредактировано] Я новичок в kivy, и я хотел бы спросить, возможно ли содержать календарь в BoxLayout вместе с другими BoxLayouts, которые будут отображать ввод выбранной кнопки календаря. Я пытался добавить его в качестве виджета, но, к сожалению, он выдает эту ошибку

 File "C:\Python27\coffee.py", line 572, in calendar
 self.calendar.add_widget(self.cal)
 AttributeError: 'function' object has no attribute 'add_widget'

Я хотел бы добавить атрибут on_release (если возможно) к кнопкам, присутствующим в календаре, по мере их нажатия, например, (кнопка 1 -> перенаправить на другой экран или отобразить его текст на другом BoxLayout) вот файл python:

class Reservation(Screen):
    def __init__(self, **kwargs):
        super(Reservation, self).__init__(**kwargs)
        calen = ObjectProperty()
        self.calendar()
    def calendar(self):
        self.cal = CalendarWidget()
        self.calen.add_widget(self.cal)

и вот где это будет добавлено:

<Reservation>:
     name: "Reserve"
     calen: Cal
     BoxLayout:
         BoxLayout: 
             id: Cal
         BoxLayout: 
             id: output_box
             orientation: 'vertical'

1 Ответ

0 голосов
/ 03 мая 2018

Как я указывал в моих комментариях, плохая практика программирования - вызывать переменную и функцию с одинаковым именем, поскольку она может скрывать другие свойства

Если перейти к пункту, 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'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...