这个简单的请求比最初看起来要复杂一些,因为您必须等待日期选择的结果,而不是现在,而不会使它过于复杂。
将它们全部放在同一个类中会使生活更轻松,就像使用 wx.DatePickerCtrl
对于它的价值,这是我试图回答你的整个问题的尝试。
import wx
import wx.calendar
import time
class MyCalendar(wx.Frame):
def __init__(self,parent):
wx.Frame.__init__(self, parent, wx.ID_ANY, "Calendar",size=(300,300))
self.Panel = wx.Panel(self)
self.cal = wx.calendar.CalendarCtrl(self.Panel, 10, wx.DateTime.Now())
self.cal.Bind(wx.calendar.EVT_CALENDAR, self.OnDate)
self.Show()
def OnDate(self,event):
self.Destroy()
return self.cal.GetDate()
class Myframe(wx.Frame):
def __init__(self, *args, **kwargs):
wx.Frame.__init__(self, *args, **kwargs)
self.Panel = wx.Panel(self)
self.Button = wx.Button(self.Panel, label="Calendar",size=(60,25),pos=(10,300))
self.Selected = wx.TextCtrl(self.Panel, -1,"Selected Date",size=(300,25),pos=(10,50))
self.Button.Bind(wx.EVT_BUTTON, self.ShowCal)
self.Show()
def ShowCal(self,event):
now = wx.DateTime.Now()
now.SetHMS(0)
self.Selected_date = MyCalendar(self.Panel)
while self.Selected_date and self.Selected_date.cal.GetDate() == now:
wx.Yield()
time.sleep(0.1)
try:
self.Selected.SetValue(str(self.Selected_date.cal.GetDate()))
except:
self.Selected.SetValue("Nothing selected")
if __name__ == '__main__':
app = wx.App()
frame = Myframe(None)
app.MainLoop()
我确信必须有一种更优雅的方式来实现这一点,希望其他人能给出答案,但正如你所见,我选择在while 循环中等待,直到得到Now 以外的结果已选中,Now 已调整为今天的午夜,因为这是日历返回的内容。
编辑:
答案是使用event,它由日历日期选择触发(双击日期)
import wx
import wx.adv
import datetime
import wx.lib.newevent
cal_event, EVT_CAL_EVENT = wx.lib.newevent.NewEvent()
class MyCalendar(wx.Frame):
def __init__(self,parent):
wx.Frame.__init__(self, parent, wx.ID_ANY, "Calendar",size=(300,300))
self.parent = parent
self.Panel = wx.Panel(self)
self.cal = wx.adv.CalendarCtrl(self.Panel, 10, wx.DateTime.Now())
self.cal.Bind(wx.adv.EVT_CALENDAR, self.OnDate)
self.Show()
def OnDate(self,event):
evt = cal_event(data=self.cal.GetDate())
wx.PostEvent(self, evt) #post EVT_CAL_EVENT
class Myframe(wx.Frame):
def __init__(self, *args, **kwargs):
wx.Frame.__init__(self, *args, **kwargs)
self.Panel = wx.Panel(self)
self.Button = wx.Button(self.Panel, label="Calendar",size=(60,25),pos=(10,300))
self.Selected = wx.TextCtrl(self.Panel, -1,"Selected Date",size=(300,25),pos=(10,50))
self.Button.Bind(wx.EVT_BUTTON, self.ShowCal)
self.Show()
def ShowCal(self,event):
now = wx.DateTime.Now()
now.SetHMS(0)
self.Selected_date = MyCalendar(self)
self.Selected_date.Bind(EVT_CAL_EVENT, self.GetCal)
def GetCal(self,event):
ymd = map(int, event.data.FormatISODate().split('-'))
d = datetime.date(*ymd) # Convert to a datetime so we can use standard formatting
self.Selected.SetValue(d.strftime("%a - %d/%m/%Y"))
self.Selected_date.Destroy()
del self.Selected_date
if __name__ == '__main__':
app = wx.App()
frame = Myframe(None)
app.MainLoop()
这将日期提供为“工作日名称 - dd/mm/yyyy”,例如周二 - 2021 年 2 月 23 日