我想把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()
您可以在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()