首页 > 解决方案 > 将不可用的日期显示为灰色 kivymd 日期选择器或 Kivy 日历

问题描述

我正在尝试在 kivymd 日期选择器上将不可用的日期变灰(如果更容易的话,很高兴使用 Kivy 日历)并使它不会让用户单击变灰的日期,或者它只会弹出一个说此日期不可用。

我知道如何检查日期是否无法选择,我可以根据包含不可用日期的列表检查选择的日期,如果选择在列表中,我可以弹出一个弹出窗口,但我不确定该怎么做设计方面 - 当用户打开日历时将不可用的日期显示为灰色。

from kivy.lang import Builder
from kivy.factory import Factory
from kivy.properties import ObjectProperty
from kivymd.app import MDApp
from kivymd.uix.picker import MDDatePicker

kv = """
<Pickers@Screen>
    name: "pickers"

    BoxLayout:
        orientation: "vertical"
        spacing: dp(20)
        pos_hint: {"center_x": .5, "center_y": .5}
        size_hint_y: None
        height: self.minimum_height

        MDRaisedButton:
            text: "Open date picker"
            pos_hint: {"center_x": .5}
            opposite_colors: True
            on_release: app.show_example_date_picker()

        MDLabel:
            id: date_picker_label
            theme_text_color: "Primary"
            halign: "center"

        BoxLayout:
            size_hint: None, None
            size: self.minimum_size
            pos_hint: {"center_x": .5}

            Label:
                theme_text_color: "Primary"
                text: "Start on previous date"
                size_hint_x: None
                width: self.texture_size[0]
                color: 0, 0, 0, 1

            MDCheckbox:
                id: date_picker_use_previous_date
                size_hint: None, None
                size: dp(48), dp(48)
"""

class MainApp(MDApp):
    previous_date = ObjectProperty()

    def __init__(self, **kwargs):
        self.title = "KivyMD Examples - Date Picker"
        super().__init__(**kwargs)

    def build(self):
        Builder.load_string(kv)
        self.root = Factory.Pickers()

    def show_example_date_picker(self, *args):
        if self.root.ids.date_picker_use_previous_date.active:
            pd = self.previous_date
            try:
                MDDatePicker(self.set_previous_date,
                             pd.year, pd.month, pd.day).open()
            except AttributeError:
                MDDatePicker(self.set_previous_date).open()
        else:
            MDDatePicker(self.set_previous_date).open()

    def set_previous_date(self, date_obj):
        self.previous_date = date_obj
        self.root.ids.date_picker_label.text = str(date_obj)


if __name__ == "__main__":
    MainApp().run()

标签: pythonkivykivy-language

解决方案


您可以在 show_date_picker 函数中设置最小和最大日期。超出范围的所有内容都将变灰。

def show_date_picker(self):
    min_date = datetime.strptime("2020:02:15", '%Y:%m:%d').date()
    max_date = datetime.strptime("2020:05:30", '%Y:%m:%d').date()
    date_dialog = MDDatePicker(
    callback=self.get_date,
    min_date=min_date,
    max_date=max_date,
    )
    date_dialog.open()

推荐阅读