2017-09-25 111 views
1

你如何使按鈕打開日曆,然後選擇日期並關閉它? 到目前爲止,我管理的只是創建日曆(我不明白爲什麼它總是創建2)。但我無法弄清楚如何獲得選定的日期。我使用的Python 3 pythonwx從python獲取選定日期wx.lib.calendar

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) 

回答

1
import wx 
import wx.calendar 
class MyCalendar(wx.Frame): 

    def __init__(self, *args, **kargs): 
     wx.Frame.__init__(self, *args, **kargs) 
     self.cal = wx.calendar.CalendarCtrl(self, 10, wx.DateTime.Now()) 
     self.cal.Bind(wx.calendar.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() 

的日期現在雙擊。

我會留下來研究創建一個框架/面板並在其上放置一個按鈕來激活日曆。

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已被調整爲今天午夜,因爲這是Calendar返回的結果。
您必須調整wxpython Phoenix的代碼,因爲我仍然使用classic。