将不可用的日期 kivymd 日期选择器或 Kivy 日历涂抹掉

问题描述 投票:1回答:1

我想把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()
python kivy kivy-language
1个回答
0
投票

您可以在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()
© www.soinside.com 2019 - 2024. All rights reserved.