代码之家  ›  专栏  ›  技术社区  ›  Nastyjoe

从python wx获取选定日期。lib。日历

  •  3
  • Nastyjoe  · 技术社区  · 9 年前

    如何制作打开日历然后选择日期并关闭的按钮? 到目前为止,我只创建了日历(我不明白为什么它总是创建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)
    
    2 回复  |  直到 9 年前
        1
  •  3
  •   Nikola Nikolov Rolf of Saxony    7 年前
    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
  •  2
  •   Rolf of Saxony    5 年前


    把它们放在同一个课堂上,就像使用 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 被选中,并且 现在

    编辑: 答案是使用 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()
    

    推荐文章