1 #----------------------------------------------------------------------------
3 # Purpose: Calendar control display testing on panel for wxPython demo
5 # Author: Lorne White (email: lwhite1@planet.eon.net)
9 # Licence: wxWindows license
10 #----------------------------------------------------------------------------
12 from wxPython
.wx
import *
13 from wxPython
.lib
.calendar
import wxCalendar
, Month
, PrtCalDraw
, CalenDlg
19 # highlighted days in month
32 11: [6, 9, 12, 28, 29],
33 12: [8, 9, 10, 11, 20] }
35 # test of full window calendar control functions
42 monthlist
.append(name
)
45 class TestPanel(wxPanel
):
46 def __init__(self
, parent
, log
, frame
):
47 wxPanel
.__init
__(self
, parent
, -1)
52 self
.calend
= wxCalendar(self
, -1, wxPoint(100, 50), wxSize(200, 180))
54 # start_month = 2 # preselect the date for calendar
57 start_month
= self
.calend
.GetMonth() # get the current month & year
58 start_year
= self
.calend
.GetYear()
60 # month list from DateTime module
62 monthlist
= GetMonthList()
65 self
.date
= wxComboBox(self
, mID
, "",
66 wxPoint(100, 20), wxSize(90, -1),
67 monthlist
, wxCB_DROPDOWN
)
68 self
.date
.SetSelection(start_month
-1)
69 EVT_COMBOBOX(self
, mID
, self
.EvtComboBox
)
71 # set start month and year
73 self
.calend
.SetMonth(start_month
)
74 self
.calend
.SetYear(start_year
)
76 # set attributes of calendar
78 self
.calend
.hide_title
= True
79 self
.calend
.HideGrid()
80 self
.calend
.SetWeekColor('WHITE', 'BLACK')
88 self
.Connect(self
.calend
.GetId(), -1, 2100, self
.MouseClick
)
90 # scroll bar for month selection
93 self
.scroll
= wxScrollBar(self
, mID
, wxPoint(100, 240), wxSize(200, 20), wxSB_HORIZONTAL
)
94 self
.scroll
.SetScrollbar(start_month
-1, 1, 12, 1, True)
95 EVT_COMMAND_SCROLL(self
, mID
, self
.Scroll
)
97 # spin control for year selection
99 self
.dtext
= wxTextCtrl(self
, -1, str(start_year
), wxPoint(200, 20), wxSize(60, -1))
100 h
= self
.dtext
.GetSize().height
103 self
.spin
= wxSpinButton(self
, mID
, wxPoint(270, 20), wxSize(h
*2, h
))
104 self
.spin
.SetRange(1980, 2010)
105 self
.spin
.SetValue(start_year
)
106 EVT_SPIN(self
, mID
, self
.OnSpin
)
108 # button for calendar dialog test
110 wxStaticText(self
, -1, "Test Calendar Dialog", wxPoint(350, 50), wxSize(150, -1))
113 bmp
= images
.getCalendarBitmap()
114 self
.but
= wxBitmapButton(self
, mID
, bmp
, wxPoint(380, 80))#, wxSize(30, 30))
115 EVT_BUTTON(self
, mID
, self
.TestDlg
)
117 # button for calendar window test
119 wxStaticText(self
, -1, "Test Calendar Window", wxPoint(350, 150), wxSize(150, -1))
122 self
.but
= wxBitmapButton(self
, mID
, bmp
, wxPoint(380, 180))#, wxSize(30, 30))
123 EVT_BUTTON(self
, mID
, self
.TestFrame
)
125 wxStaticText(self
, -1, "Test Calendar Print", wxPoint(350, 250), wxSize(150, -1))
128 self
.but
= wxBitmapButton(self
, mID
, bmp
, wxPoint(380, 280))#, wxSize(30, 30))
129 EVT_BUTTON(self
, mID
, self
.OnPreview
)
133 def TestDlg(self
, event
): # test the date dialog
136 if dlg
.ShowModal() == wxID_OK
:
141 new_date
= str(month
) + '/'+ str(day
) + '/'+ str(year
)
142 self
.log
.WriteText('Date Selected: %s\n' % new_date
)
144 self
.log
.WriteText('No Date Selected')
146 # calendar window test
148 def TestFrame(self
, event
):
149 frame
= CalendFrame(self
, -1, "Test Calendar", self
.log
)
153 # calendar print preview
155 def OnPreview(self
, event
):
156 month
= self
.calend
.GetMonth()
157 year
= self
.calend
.GetYear()
159 prt
= PrintCalend(self
.frame
, month
, year
)
162 # month and year control events
164 def OnSpin(self
, event
):
165 year
= event
.GetPosition()
166 self
.dtext
.SetValue(str(year
))
167 self
.calend
.SetYear(year
)
168 self
.calend
.Refresh()
170 def EvtComboBox(self
, event
):
171 name
= event
.GetString()
172 self
.log
.WriteText('EvtComboBox: %s\n' % name
)
173 monthval
= self
.date
.FindString(name
)
174 self
.scroll
.SetScrollbar(monthval
, 1, 12, 1, True)
176 self
.calend
.SetMonth(monthval
+1)
179 def Scroll(self
, event
):
180 value
= self
.scroll
.GetThumbPosition()
181 monthval
= int(value
)+1
182 self
.calend
.SetMonth(monthval
)
184 self
.log
.WriteText('Month: %s\n' % value
)
186 name
= Month
[monthval
]
187 self
.date
.SetValue(name
)
191 def MouseClick(self
, evt
):
192 text
= '%s CLICK %02d/%02d/%d' % (evt
.click
, evt
.day
, evt
.month
, evt
.year
) # format date
193 self
.log
.WriteText('Date Selected: ' + text
+ '\n')
196 # set the highlighted days for the calendar
198 def ResetDisplay(self
):
199 month
= self
.calend
.GetMonth()
201 set_days
= test_days
[month
]
203 set_days
= [1, 5, 12]
205 self
.calend
.AddSelect([4, 11], 'BLUE', 'WHITE')
206 self
.calend
.SetSelDay(set_days
)
207 self
.calend
.Refresh()
209 # increment and decrement toolbar controls
211 def OnIncYear(self
, event
):
212 self
.calend
.IncYear()
215 def OnDecYear(self
, event
):
216 self
.calend
.DecYear()
219 def OnIncMonth(self
, event
):
220 self
.calend
.IncMonth()
223 def OnDecMonth(self
, event
):
224 self
.calend
.DecMonth()
227 def OnCurrent(self
, event
):
228 self
.calend
.SetCurrentDay()
231 # test of full window calendar control functions
233 class CalendFrame(wxFrame
):
234 def __init__(self
, parent
, id, title
, log
):
235 wxFrame
.__init
__(self
, parent
, id, title
, size
=wxSize(400, 400),
236 style
=wxDEFAULT_FRAME_STYLE|wxNO_FULL_REPAINT_ON_RESIZE
)
237 EVT_CLOSE(self
, self
.OnCloseWindow
)
240 self
.CreateStatusBar()
241 self
.mainmenu
= wxMenuBar()
244 menu
= self
.MakeFileMenu()
245 self
.mainmenu
.Append(menu
, '&File')
247 self
.MakeToolMenu() # toolbar
249 self
.SetMenuBar(self
.mainmenu
)
250 self
.calend
= wxCalendar(self
, -1)
251 self
.calend
.SetCurrentDay()
252 self
.calend
.grid_color
= 'BLUE'
253 self
.calend
.SetBusType()
254 # self.calend.ShowWeekEnd()
258 self
.Connect(self
.calend
.GetId(), -1, 2100, self
.MouseClick
)
260 def MouseClick(self
, evt
):
261 text
= '%s CLICK %02d/%02d/%d' % (evt
.click
, evt
.day
, evt
.month
, evt
.year
) # format date
262 self
.log
.WriteText('Date Selected: ' + text
+ '\n')
264 def OnCloseWindow(self
, event
):
267 def ResetDisplay(self
):
268 month
= self
.calend
.GetMonth()
270 set_days
= test_days
[month
]
272 set_days
= [1, 5, 12]
274 self
.calend
.AddSelect([2, 16], 'GREEN', 'WHITE')
276 self
.calend
.SetSelDay(set_days
)
277 self
.calend
.Refresh()
279 def OnIncYear(self
, event
):
280 self
.calend
.IncYear()
283 def OnDecYear(self
, event
):
284 self
.calend
.DecYear()
287 def OnIncMonth(self
, event
):
288 self
.calend
.IncMonth()
291 def OnDecMonth(self
, event
):
292 self
.calend
.DecMonth()
295 def OnCurrent(self
, event
):
296 self
.calend
.SetCurrentDay()
299 def MakeFileMenu(self
):
303 menu
.Append(mID
, 'Decrement', 'Next')
304 EVT_MENU(self
, mID
, self
.OnDecMonth
)
307 menu
.Append(mID
, 'Increment', 'Dec')
308 EVT_MENU(self
, mID
, self
.OnIncMonth
)
310 menu
.AppendSeparator()
313 menu
.Append(mID
, 'E&xit', 'Exit')
314 EVT_MENU(self
, mID
, self
.OnCloseWindow
)
318 def MakeToolMenu(self
):
319 tb
= self
.CreateToolBar(wxTB_HORIZONTAL|wxNO_BORDER
)
322 SetToolPath(self
, tb
, mID
, images
.getDbDecBitmap(), 'Dec Year')
323 EVT_TOOL(self
, mID
, self
.OnDecYear
)
326 SetToolPath(self
, tb
, mID
, images
.getDecBitmap(), 'Dec Month')
327 EVT_TOOL(self
, mID
, self
.OnDecMonth
)
330 SetToolPath(self
, tb
, mID
, images
.getPtBitmap(), 'Current Month')
331 EVT_TOOL(self
, mID
, self
.OnCurrent
)
334 SetToolPath(self
, tb
, mID
, images
.getIncBitmap(), 'Inc Month')
335 EVT_TOOL(self
, mID
, self
.OnIncMonth
)
338 SetToolPath(self
, tb
, mID
, images
.getDbIncBitmap(), 'Inc Year')
339 EVT_TOOL(self
, mID
, self
.OnIncYear
)
343 #---------------------------------------------------------------------------
345 # example class for printing/previewing calendars
348 def __init__(self
, parent
, month
, year
):
355 self
.printData
= wxPrintData()
358 self
.grid_color
= 'BLUE'
359 self
.back_color
= 'WHITE'
360 self
.sel_color
= 'RED'
361 self
.high_color
= 'LIGHT BLUE'
365 self
.sel_key
= None # last used by
366 self
.sel_lst
= [] # highlighted selected days
369 self
.hide_title
= False
370 self
.hide_grid
= False
391 def SetDates(self
, month
, year
):
395 def SetStyleDef(self
, desc
):
398 def SetCopies(self
, copies
): # number of copies of label
401 def SetStart(self
, start
): # start position of label
405 printout
= SetPrintout(self
)
406 printout2
= SetPrintout(self
)
407 self
.preview
= wxPrintPreview(printout
, printout2
, self
.printData
)
408 if not self
.preview
.Ok():
409 wxMessageBox("There was a problem printing!", "Printing", wxOK
)
412 self
.preview
.SetZoom(60) # initial zoom value
414 frame
= wxPreviewFrame(self
.preview
, self
.frame
, "Print preview")
417 frame
.SetPosition(self
.frame
.GetPosition())
418 frame
.SetSize(self
.frame
.GetSize())
422 pdd
= wxPrintDialogData()
423 pdd
.SetPrintData(self
.printData
)
424 printer
= wxPrinter(pdd
)
425 printout
= SetPrintout(self
)
426 frame
= wxFrame(None, -1, "Test")
427 if not printer
.Print(frame
, printout
):
428 wxMessageBox("There was a problem printing.\nPerhaps your current printer is not set correctly?", "Printing", wxOK
)
430 self
.printData
= printer
.GetPrintDialogData().GetPrintData()
433 def DoDrawing(self
, DC
):
434 size
= DC
.GetSizeTuple()
437 cal
= PrtCalDraw(self
)
439 if self
.preview
is None:
440 cal
.SetPSize(size
[0]/self
.pagew
, size
[1]/self
.pageh
)
441 cal
.SetPreview(False)
444 if self
.preview
== 1:
445 cal
.SetPSize(size
[0]/self
.pagew
, size
[1]/self
.pageh
)
447 cal
.SetPSize(self
.pwidth
, self
.pheight
)
449 cal
.SetPreview(self
.preview
)
451 cal
.hide_title
= self
.hide_title
# set the calendar parameters
452 cal
.hide_grid
= self
.hide_grid
454 cal
.grid_color
= self
.grid_color
455 cal
.high_color
= self
.high_color
456 cal
.back_color
= self
.back_color
457 cal
.outer_border
= False
461 cal_size
= wxSize(3.0, 3.0)
462 cal
.SetSize(cal_size
)
464 year
, month
= self
.year
, self
.month
470 cal
.SetCal(year
, month
) # current month
474 set_days
= test_days
[month
]
476 set_days
= [1, 5, 12]
478 cal
.AddSelect([2, 16], 'GREEN', 'WHITE')
480 cal
.DrawCal(DC
, set_days
)
482 year
, month
= self
.IncMonth(year
, month
)
484 x
= x
+ 4.0 # next column
488 self
.ymax
= DC
.MaxY()
489 self
.xmax
= DC
.MaxX()
491 def IncMonth(self
, year
, month
): # next month
499 def GetTotalPages(self
):
503 def SetPage(self
, page
):
506 def SetPageSize(self
, width
, height
):
507 self
.pwidth
, self
.pheight
= width
, height
509 def SetTotalSize(self
, width
, height
):
510 self
.ptwidth
, self
.ptheight
= width
, height
512 def SetPreview(self
, preview
, scale
):
513 self
.preview
= preview
516 def SetTotalSize(self
, width
, height
):
518 self
.ptheight
= height
520 def SetToolPath(self
, tb
, id, bmp
, title
):
521 tb
.AddSimpleTool(id, bmp
, title
, title
)
523 class SetPrintout(wxPrintout
):
524 def __init__(self
, canvas
):
525 wxPrintout
.__init
__(self
)
529 def OnBeginDocument(self
, start
, end
):
530 return self
.base_OnBeginDocument(start
, end
)
532 def OnEndDocument(self
):
533 self
.base_OnEndDocument()
535 def HasPage(self
, page
):
536 if page
<= self
.end_pg
:
541 def GetPageInfo(self
):
542 self
.end_pg
= self
.canvas
.GetTotalPages()
548 return (str_pg
, end_pg
, str_pg
, end_pg
)
550 def OnPreparePrinting(self
):
551 self
.base_OnPreparePrinting()
553 def OnBeginPrinting(self
):
556 self
.preview
= self
.IsPreview()
558 self
.pixelsPerInch
= self
.GetPPIScreen()
560 self
.pixelsPerInch
= self
.GetPPIPrinter()
562 (w
, h
) = dc
.GetSizeTuple()
563 scaleX
= float(w
) / 1000
564 scaleY
= float(h
) / 1000
565 self
.printUserScale
= min(scaleX
, scaleY
)
567 self
.base_OnBeginPrinting()
570 self
.psizew
, self
.psizeh
= self
.GetPPIPrinter()
571 return self
.psizew
, self
.psizeh
573 def GetTotalSize(self
):
574 self
.ptsizew
, self
.ptsizeh
= self
.GetPageSizePixels()
575 return self
.ptsizew
, self
.ptsizeh
577 def OnPrintPage(self
, page
):
579 (w
, h
) = dc
.GetSizeTuple()
580 scaleX
= float(w
) / 1000
581 scaleY
= float(h
) / 1000
582 self
.printUserScale
= min(scaleX
, scaleY
)
583 dc
.SetUserScale(self
.printUserScale
, self
.printUserScale
)
585 self
.preview
= self
.IsPreview()
587 self
.canvas
.SetPreview(self
.preview
, self
.printUserScale
)
588 self
.canvas
.SetPage(page
)
590 self
.ptsizew
, self
.ptsizeh
= self
.GetPageSizePixels()
591 self
.canvas
.SetTotalSize(self
.ptsizew
, self
.ptsizeh
)
593 self
.psizew
, self
.psizeh
= self
.GetPPIPrinter()
594 self
.canvas
.SetPageSize(self
.psizew
, self
.psizeh
)
596 self
.canvas
.DoDrawing(dc
)
601 frame
= CalendFrame(None, -1, "Test Calendar")
603 self
.SetTopWindow(frame
)
606 #---------------------------------------------------------------------------
608 def MessageDlg(self
, message
, type = 'Message'):
609 dlg
= wxMessageDialog(self
, message
, type, wxOK | wxICON_INFORMATION
)
613 #---------------------------------------------------------------------------
615 def runTest(frame
, nb
, log
):
616 win
= TestPanel(nb
, log
, frame
)
619 #---------------------------------------------------------------------------
623 This control provides a calendar control class for displaying and selecting dates. In addition, the class is extended and can now be used for printing/previewing.
625 Additional features include weekend highlighting and business type Monday-Sunday format.
627 See example for various methods used to set display month, year, and highlighted dates (different font and background colours).
636 if __name__
== '__main__':
639 run
.main(['', os
.path
.basename(sys
.argv
[0])])