从python wx.lib.calendar获取所选日期

时间:2017-09-25 08:36:14

标签: python python-3.x wxpython

如何制作打开日历然后选择日期并关闭日期的按钮? 到目前为止,我只管理创建日历(我不明白为什么它总是创建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 个答案:

答案 0 :(得分: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()

现在双击日期。

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

答案 1 :(得分:0)

这个简单的请求比它最初看起来要复杂得多,因为你必须等待日期选择的结果,而不是现在,而不会使它复杂化。
将所有内容放在同一个类中会使生活更轻松,就像使用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调整为午夜,因为这是日历返回的内容。
您必须调整wxpython Phoenix的代码,因为我仍然使用经典。