kivy日历:如何在BoxLayout中插入kivy日历并在其按钮中设置功能



[编辑]我是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 来访问小部件,因为子项尚未在构造中建立。在Clockschedule_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'

最新更新