[编辑]我是kivy的新手,我想问一下是否可以将日历包含在BoxLayout中,以及其他将显示日历所选按钮输入的BoxLayouts。我试图将其添加为小部件,但不幸的是它抛出了此错误
File "C:Python27coffee.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'
正如我在评论中指出的那样,调用具有相同名称的变量和函数是一种糟糕的编程实践,因为它可以隐藏其他属性
说到点子上,calendar = ObjectProperty()
没有链接到日历不链接到BoxLayout
的任何内容,它也是一个局部变量,当构造函数完成时,它的生命周期就结束了。在您使用self.calendar.add_widget(self.cal)
的情况下,self.calendar 是指您调用它的日历方法,显然方法的名称不是导致该错误的小部件。
你必须做的是ObjectProperty
是类的属性,并在 .kv 中分配它,除了更改函数的名称:
您必须使用 clock 来访问小部件,因为子项尚未在构造中建立。在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'