【问题标题】:Get selected date from python wx.lib.calendar从 python wx.lib.calendar 获取选定的日期
【发布时间】:2017-09-25 08:36:14
【问题描述】:

如何制作打开日历然后选择日期并关闭它的按钮? 到目前为止,我只管理创建日历(我不明白为什么它总是创建 2)。但我不知道如何获得选定的日期。我在 Python 3 上使用 pythonwx。

class MyCalendar(wx.Frame):

    def __init__(self, *args, **kargs):
        wx.Frame.__init__(self, *args, **kargs)
        self.cal = CalendarCtrl(self, 10, wx.DateTime.Now())
        self.timer = wx.Timer(self)



if __name__ == '__main__':  
    app = wx.App()
    frame = MyCalendar(None)
    frame.Show()
    app.MainLoop()

编辑

添加py3版本

from wx.adv import CalendarCtrl, GenericCalendarCtrl, CalendarDateAttr

class MyCalendar(wx.Frame):

    def __init__(self, *args, **kargs):
        wx.Frame.__init__(self, *args, **kargs)
        self.cal = CalendarCtrl(self, 10, wx.DateTime.Now())
        self.cal.Bind(wx.adv.EVT_CALENDAR, self.OnDate)



    def OnDate(self,event):
        print (self.cal.GetDate())      
        wx.Window.Close(self)

【问题讨论】:

    标签: python python-3.x wxpython


    【解决方案1】:
    import wx
    import wx.adv
    class MyCalendar(wx.Frame):
    
        def __init__(self, *args, **kargs):
            wx.Frame.__init__(self, *args, **kargs)
            self.cal = wx.adv.CalendarCtrl(self, 10, wx.DateTime.Now())
            self.cal.Bind(wx.adv.EVT_CALENDAR, self.OnDate)
    
        def OnDate(self,event):
            print(self.cal.GetDate())
    
    
    if __name__ == '__main__':
        app = wx.App()
        frame = MyCalendar(None)
        frame.Show()
        app.MainLoop()
    

    现在双击一个日期。

    我会让你研究创建一个框架/面板并在其上放置一个按钮来激活日历。

    【讨论】:

      【解决方案2】:

      这个简单的请求比最初看起来要复杂一些,因为您必须等待日期选择的结果,而不是现在,而不会使它过于复杂。
      将它们全部放在同一个类中会使生活更轻松,就像使用 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 日

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-14
        • 2015-07-06
        • 2019-09-04
        • 2020-12-06
        相关资源
        最近更新 更多