2 #----------------------------------------------------------------------------
4 # Purpose: Testing lots of stuff, controls, window types, etc.
8 # Created: A long time ago, in a galaxy far, far away...
10 # Copyright: (c) 1999 by Total Control Software
11 # Licence: wxWindows license
12 #----------------------------------------------------------------------------
16 import wx
# This module uses the new wx namespace
24 ##raw_input("Press a key...")
27 #---------------------------------------------------------------------------
32 ('Recent Additions', [
37 'XmlResourceSubclass',
44 # managed windows == things with a (optional) caption you can close
45 ('Base Frames and Dialogs', [
69 # dialogs from libraries
73 'MultipleChoiceDialog',
74 'ScrolledMessageDialog',
78 ('Core Windows/Controls', [
114 ('Custom Controls', [
127 # controls coming from other libraries
128 ('More Windows/Controls', [
129 #'RightTextCtrl', deprecated as we have wxTE_RIGHT now.
143 'MaskedEditControls',
159 # How to lay out the controls in a frame/dialog
169 'XmlResourceHandler',
170 'XmlResourceSubclass',
174 ('Process and Events', [
186 ('Clipboard and DnD', [
220 # need libs not coming with the demo
221 ('Objects using an external library', [
222 'ActiveXWrapper_Acrobat',
225 #'PlotCanvas', # deprecated, use PyPlot
229 ('Check out the samples dir too', [
236 #---------------------------------------------------------------------------
237 # Show how to derive a custom wxLog class
239 class MyLog(wx
.PyLog
):
240 def __init__(self
, textCtrl
, logTime
=0):
241 wx
.PyLog
.__init
__(self
)
243 self
.logTime
= logTime
245 def DoLogString(self
, message
, timeStamp
):
247 message
= time
.strftime("%X", time
.localtime(timeStamp
)) + \
250 self
.tc
.AppendText(message
+ '\n')
253 class MyTP(wx
.PyTipProvider
):
255 return "This is my tip"
257 #---------------------------------------------------------------------------
258 # A class to be used to display source code in the demo. Try using the
259 # wxSTC in the StyledTextCtrl_2 sample first, fall back to wxTextCtrl
260 # if there is an error, such as the stc module not being present.
266 from StyledTextCtrl_2
import PythonSTC
267 class DemoCodeViewer(PythonSTC
):
268 def __init__(self
, parent
, ID
):
269 PythonSTC
.__init
__(self
, parent
, ID
, wx
.BORDER_NONE
)
272 # Some methods to make it compatible with how the wxTextCtrl is used
273 def SetValue(self
, value
):
274 self
.SetReadOnly(False)
276 self
.SetReadOnly(True)
281 def SetInsertionPoint(self
, pos
):
282 self
.SetCurrentPos(pos
)
284 def ShowPosition(self
, pos
):
287 def GetLastPosition(self
):
288 return self
.GetLength()
290 def GetRange(self
, start
, end
):
291 return self
.GetTextRange(start
, end
)
293 def GetSelection(self
):
294 return self
.GetAnchor(), self
.GetCurrentPos()
296 def SetSelection(self
, start
, end
):
297 self
.SetSelectionStart(start
)
298 self
.SetSelectionEnd(end
)
300 def SetUpEditor(self
):
302 This method carries out the work of setting up the demo editor.
303 It's seperate so as not to clutter up the init code.
307 self
.SetLexer(stc
.STC_LEX_PYTHON
)
308 self
.SetKeyWords(0, " ".join(keyword
.kwlist
))
311 self
.SetProperty("fold", "1" )
313 # Highlight tab/space mixing (shouldn't be any)
314 self
.SetProperty("tab.timmy.whinge.level", "1")
316 # Set left and right margins
319 # Set up the numbers in the margin for margin #1
320 self
.SetMarginType(1, wx
.stc
.STC_MARGIN_NUMBER
)
321 # Reasonable value for, say, 4-5 digits using a mono font (40 pix)
322 self
.SetMarginWidth(1, 40)
324 # Indentation and tab stuff
325 self
.SetIndent(4) # Proscribed indent size for wx
326 self
.SetIndentationGuides(True) # Show indent guides
327 self
.SetBackSpaceUnIndents(True)# Backspace unindents rather than delete 1 space
328 self
.SetTabIndents(True) # Tab key indents
329 self
.SetTabWidth(4) # Proscribed tab size for wx
330 self
.SetUseTabs(False) # Use spaces rather than tabs, or
331 # TabTimmy will complain!
333 self
.SetViewWhiteSpace(False) # Don't view white space
336 #self.SetEOLMode(wx.stc.STC_EOL_CRLF) # Just leave it at the default (autosense)
337 self
.SetViewEOL(False)
338 # No right-edge mode indicator
339 self
.SetEdgeMode(stc
.STC_EDGE_NONE
)
341 # Setup a margin to hold fold markers
342 self
.SetMarginType(2, stc
.STC_MARGIN_SYMBOL
)
343 self
.SetMarginMask(2, stc
.STC_MASK_FOLDERS
)
344 self
.SetMarginSensitive(2, True)
345 self
.SetMarginWidth(2, 12)
347 # and now set up the fold markers
348 self
.MarkerDefine(stc
.STC_MARKNUM_FOLDEREND
, stc
.STC_MARK_BOXPLUSCONNECTED
, "white", "black")
349 self
.MarkerDefine(stc
.STC_MARKNUM_FOLDEROPENMID
, stc
.STC_MARK_BOXMINUSCONNECTED
, "white", "black")
350 self
.MarkerDefine(stc
.STC_MARKNUM_FOLDERMIDTAIL
, stc
.STC_MARK_TCORNER
, "white", "black")
351 self
.MarkerDefine(stc
.STC_MARKNUM_FOLDERTAIL
, stc
.STC_MARK_LCORNER
, "white", "black")
352 self
.MarkerDefine(stc
.STC_MARKNUM_FOLDERSUB
, stc
.STC_MARK_VLINE
, "white", "black")
353 self
.MarkerDefine(stc
.STC_MARKNUM_FOLDER
, stc
.STC_MARK_BOXPLUS
, "white", "black")
354 self
.MarkerDefine(stc
.STC_MARKNUM_FOLDEROPEN
, stc
.STC_MARK_BOXMINUS
, "white", "black")
356 # Global default style
357 if wx
.Platform
== '__WXMSW__':
358 self
.StyleSetSpec(stc
.STC_STYLE_DEFAULT
,
359 'fore:#000000,back:#FFFFFF,face:Courier New,size:9')
361 self
.StyleSetSpec(stc
.STC_STYLE_DEFAULT
,
362 'fore:#000000,back:#FFFFFF,face:Courier,size:12')
364 # Clear styles and revert to default.
367 # Following style specs only indicate differences from default.
368 # The rest remains unchanged.
370 # Line numbers in margin
371 self
.StyleSetSpec(wx
.stc
.STC_STYLE_LINENUMBER
,'fore:#000000,back:#99A9C2')
374 self
.StyleSetSpec(wx
.stc
.STC_STYLE_BRACELIGHT
,'fore:#00009D,back:#FFFF00')
376 self
.StyleSetSpec(wx
.stc
.STC_STYLE_BRACEBAD
,'fore:#00009D,back:#FF0000')
378 self
.StyleSetSpec(wx
.stc
.STC_STYLE_INDENTGUIDE
, "fore:#CDCDCD")
381 self
.StyleSetSpec(wx
.stc
.STC_P_DEFAULT
, 'fore:#000000')
383 self
.StyleSetSpec(wx
.stc
.STC_P_COMMENTLINE
, 'fore:#008000,back:#F0FFF0')
384 self
.StyleSetSpec(wx
.stc
.STC_P_COMMENTBLOCK
, 'fore:#008000,back:#F0FFF0')
386 self
.StyleSetSpec(wx
.stc
.STC_P_NUMBER
, 'fore:#008080')
387 # Strings and characters
388 self
.StyleSetSpec(wx
.stc
.STC_P_STRING
, 'fore:#800080')
389 self
.StyleSetSpec(wx
.stc
.STC_P_CHARACTER
, 'fore:#800080')
391 self
.StyleSetSpec(wx
.stc
.STC_P_WORD
, 'fore:#000080,bold')
393 self
.StyleSetSpec(wx
.stc
.STC_P_TRIPLE
, 'fore:#800080,back:#FFFFEA')
394 self
.StyleSetSpec(wx
.stc
.STC_P_TRIPLEDOUBLE
, 'fore:#800080,back:#FFFFEA')
396 self
.StyleSetSpec(wx
.stc
.STC_P_CLASSNAME
, 'fore:#0000FF,bold')
398 self
.StyleSetSpec(wx
.stc
.STC_P_DEFNAME
, 'fore:#008080,bold')
400 self
.StyleSetSpec(wx
.stc
.STC_P_OPERATOR
, 'fore:#800000,bold')
401 # Identifiers. I leave this as not bold because everything seems
402 # to be an identifier if it doesn't match the above criterae
403 self
.StyleSetSpec(wx
.stc
.STC_P_IDENTIFIER
, 'fore:#000000')
406 self
.SetCaretForeground("BLUE")
407 # Selection background
408 self
.SetSelBackground(1, '#66CCFF')
410 self
.SetSelBackground(True, wx
.SystemSettings_GetColour(wx
.SYS_COLOUR_HIGHLIGHT
))
411 self
.SetSelForeground(True, wx
.SystemSettings_GetColour(wx
.SYS_COLOUR_HIGHLIGHTTEXT
))
415 class DemoCodeViewer(wx
.TextCtrl
):
416 def __init__(self
, parent
, ID
):
417 wx
.TextCtrl
.__init
__(self
, parent
, ID
, style
=
418 wx
.TE_MULTILINE | wx
.TE_READONLY |
419 wx
.HSCROLL | wx
.TE_RICH2 | wx
.TE_NOHIDESEL
)
422 #---------------------------------------------------------------------------
425 """Convert paths to the platform-specific separator"""
426 return apply(os
.path
.join
, tuple(path
.split('/')))
429 #---------------------------------------------------------------------------
431 class wxPythonDemo(wx
.Frame
):
432 overviewText
= "wxPython Overview"
434 def __init__(self
, parent
, id, title
):
435 wx
.Frame
.__init
__(self
, parent
, -1, title
, size
= (800, 600),
436 style
=wx
.DEFAULT_FRAME_STYLE|wx
.NO_FULL_REPAINT_ON_RESIZE
)
439 self
.cwd
= os
.getcwd()
440 self
.curOverview
= ""
443 icon
= images
.getMondrianIcon()
446 if wx
.Platform
!= '__WXMAC__':
447 # setup a taskbar icon, and catch some events from it
448 icon
= wx
.IconFromBitmap(
449 images
.getMondrianImage().Scale(16,16).ConvertToBitmap() )
450 self
.tbicon
= wx
.TaskBarIcon()
451 self
.tbicon
.SetIcon(icon
, "wxPython Demo")
452 self
.tbicon
.Bind(wx
.EVT_TASKBAR_LEFT_DCLICK
, self
.OnTaskBarActivate
)
453 self
.tbicon
.Bind(wx
.EVT_TASKBAR_RIGHT_UP
, self
.OnTaskBarMenu
)
454 self
.tbicon
.Bind(wx
.EVT_MENU
, self
.OnTaskBarActivate
, id=self
.TBMENU_RESTORE
)
455 self
.tbicon
.Bind(wx
.EVT_MENU
, self
.OnTaskBarClose
, id=self
.TBMENU_CLOSE
)
457 wx
.CallAfter(self
.ShowTip
)
460 self
.Bind(wx
.EVT_IDLE
, self
.OnIdle
)
461 self
.Bind(wx
.EVT_CLOSE
, self
.OnCloseWindow
)
462 self
.Bind(wx
.EVT_ICONIZE
, self
.OnIconfiy
)
463 self
.Bind(wx
.EVT_MAXIMIZE
, self
.OnMaximize
)
466 self
.CreateStatusBar(1, wx
.ST_SIZEGRIP
)
468 splitter
= wx
.SplitterWindow(self
, -1)
469 splitter2
= wx
.SplitterWindow(splitter
, -1) ##, size=(20,20))
471 # Set up a log on the View Log Notebook page
472 self
.log
= wx
.TextCtrl(splitter2
, -1,
473 style
= wx
.TE_MULTILINE|wx
.TE_READONLY|wx
.HSCROLL
)
475 # Set the wxWindows log target to be this textctrl
476 #wx.Log_SetActiveTarget(wx.LogTextCtrl(self.log))
478 # But instead of the above we want to show how to use our own wx.Log class
479 wx
.Log_SetActiveTarget(MyLog(self
.log
))
481 # for serious debugging
482 #wx.Log_SetActiveTarget(wx.LogStderr())
483 #wx.Log_SetTraceMask(wx.TraceMessages)
487 def EmptyHandler(evt
): pass
488 #splitter.Bind(wx.EVT_ERASE_BACKGROUND, EmptyHandler)
489 #splitter2.Bind(wx.EVT_ERASE_BACKGROUND, EmptyHandler)
491 # Prevent TreeCtrl from displaying all items after destruction when True
495 self
.mainmenu
= wx
.MenuBar()
497 item
= menu
.Append(-1, '&Redirect Output',
498 'Redirect print statements to a window',
500 self
.Bind(wx
.EVT_MENU
, self
.OnToggleRedirect
, item
)
502 item
= menu
.Append(-1, 'E&xit\tAlt-X', 'Get the heck outta here!')
503 self
.Bind(wx
.EVT_MENU
, self
.OnFileExit
, item
)
504 wx
.App_SetMacExitMenuItemId(item
.GetId())
506 self
.mainmenu
.Append(menu
, '&File')
510 for item
in _treeList
:
512 for childItem
in item
[1]:
513 mi
= submenu
.Append(-1, childItem
)
514 self
.Bind(wx
.EVT_MENU
, self
.OnDemoMenu
, mi
)
515 menu
.AppendMenu(wx
.NewId(), item
[0], submenu
)
516 self
.mainmenu
.Append(menu
, '&Demo')
522 findnextID
= wx
.NewId()
524 findItem
= menu
.Append(-1, '&Find\tCtrl-F', 'Find in the Demo Code')
525 findnextItem
= menu
.Append(-1, 'Find &Next\tF3', 'Find Next')
526 menu
.AppendSeparator()
527 helpItem
= menu
.Append(-1, '&About\tCtrl-H', 'wxPython RULES!!!')
528 wx
.App_SetMacAboutMenuItemId(helpItem
.GetId())
529 self
.Bind(wx
.EVT_MENU
, self
.OnHelpAbout
, helpItem
)
530 self
.Bind(wx
.EVT_MENU
, self
.OnHelpFind
, findItem
)
531 self
.Bind(wx
.EVT_MENU
, self
.OnFindNext
, findnextItem
)
532 self
.Bind(wx
.EVT_COMMAND_FIND
, self
.OnFind
)
533 self
.Bind(wx
.EVT_COMMAND_FIND_NEXT
, self
.OnFind
)
534 self
.Bind(wx
.EVT_COMMAND_FIND_CLOSE
, self
.OnFindClose
)
535 self
.mainmenu
.Append(menu
, '&Help')
536 self
.SetMenuBar(self
.mainmenu
)
538 self
.finddata
= wx
.FindReplaceData()
541 # This is another way to set Accelerators, in addition to
542 # using the '\t<key>' syntax in the menu items.
543 aTable
= wx
.AcceleratorTable([(wx
.ACCEL_ALT
, ord('X'), exitID
),
544 (wx
.ACCEL_CTRL
, ord('H'), helpID
),
545 (wx
.ACCEL_CTRL
, ord('F'), findID
),
546 (wx
.ACCEL_NORMAL
, WXK_F3
, findnextID
)
548 self
.SetAcceleratorTable(aTable
)
554 self
.tree
= wx
.TreeCtrl(splitter
, tID
, style
=
555 wx
.TR_DEFAULT_STYLE
#| wx.TR_HAS_VARIABLE_ROW_HEIGHT
558 root
= self
.tree
.AddRoot("wxPython Overview")
560 for item
in _treeList
:
561 child
= self
.tree
.AppendItem(root
, item
[0])
562 if not firstChild
: firstChild
= child
563 for childItem
in item
[1]:
564 theDemo
= self
.tree
.AppendItem(child
, childItem
)
565 self
.treeMap
[childItem
] = theDemo
567 self
.tree
.Expand(root
)
568 self
.tree
.Expand(firstChild
)
569 self
.tree
.Bind(wx
.EVT_TREE_ITEM_EXPANDED
, self
.OnItemExpanded
, id=tID
)
570 self
.tree
.Bind(wx
.EVT_TREE_ITEM_COLLAPSED
, self
.OnItemCollapsed
, id=tID
)
571 self
.tree
.Bind(wx
.EVT_TREE_SEL_CHANGED
, self
.OnSelChanged
, id=tID
)
572 self
.tree
.Bind(wx
.EVT_LEFT_DOWN
, self
.OnTreeLeftDown
)
575 self
.nb
= wx
.Notebook(splitter2
, -1, style
=wx
.CLIP_CHILDREN
)
577 # Set up a wx.html.HtmlWindow on the Overview Notebook page
578 # we put it in a panel first because there seems to be a
579 # refresh bug of some sort (wxGTK) when it is directly in
582 self
.ovr
= wx
.html
.HtmlWindow(self
.nb
, -1, size
=(400, 400))
583 self
.nb
.AddPage(self
.ovr
, self
.overviewText
)
585 else: # hopefully I can remove this hacky code soon, see SF bug #216861
586 panel
= wx
.Panel(self
.nb
, -1, style
=wx
.CLIP_CHILDREN
)
587 self
.ovr
= wx
.html
.HtmlWindow(panel
, -1, size
=(400, 400))
588 self
.nb
.AddPage(panel
, self
.overviewText
)
590 def OnOvrSize(evt
, ovr
=self
.ovr
):
591 ovr
.SetSize(evt
.GetSize())
593 panel
.Bind(wx
.EVT_SIZE
, OnOvrSize
)
594 panel
.Bind(wx
.EVT_ERASE_BACKGROUND
, EmptyHandler
)
597 self
.SetOverview(self
.overviewText
, overview
)
600 # Set up a notebook page for viewing the source code of each sample
601 self
.txt
= DemoCodeViewer(self
.nb
, -1)
602 self
.nb
.AddPage(self
.txt
, "Demo Code")
603 self
.LoadDemoSource('Main.py')
606 # add the windows to the splitter and split it.
607 splitter2
.SplitHorizontally(self
.nb
, self
.log
, -120)
608 splitter
.SplitVertically(self
.tree
, splitter2
, 180)
610 splitter
.SetMinimumPaneSize(20)
611 splitter2
.SetMinimumPaneSize(20)
614 # Make the splitter on the right expand the top window when resized
615 def SplitterOnSize(evt
):
616 splitter
= evt
.GetEventObject()
617 sz
= splitter
.GetSize()
618 splitter
.SetSashPosition(sz
.height
- 120, False)
621 splitter2
.Bind(wx
.EVT_SIZE
, SplitterOnSize
)
624 # select initial items
625 self
.nb
.SetSelection(0)
626 self
.tree
.SelectItem(root
)
628 if len(sys
.argv
) == 2:
630 selectedDemo
= self
.treeMap
[sys
.argv
[1]]
634 self
.tree
.SelectItem(selectedDemo
)
635 self
.tree
.EnsureVisible(selectedDemo
)
638 wx
.LogMessage('window handle: %s' % self
.GetHandle())
641 #---------------------------------------------
642 def WriteText(self
, text
):
643 if text
[-1:] == '\n':
648 def write(self
, txt
):
651 #---------------------------------------------
652 def OnItemExpanded(self
, event
):
653 item
= event
.GetItem()
654 wx
.LogMessage("OnItemExpanded: %s" % self
.tree
.GetItemText(item
))
657 #---------------------------------------------
658 def OnItemCollapsed(self
, event
):
659 item
= event
.GetItem()
660 wx
.LogMessage("OnItemCollapsed: %s" % self
.tree
.GetItemText(item
))
663 #---------------------------------------------
664 def OnTreeLeftDown(self
, event
):
665 pt
= event
.GetPosition();
666 item
, flags
= self
.tree
.HitTest(pt
)
667 if item
== self
.tree
.GetSelection():
668 self
.SetOverview(self
.tree
.GetItemText(item
)+" Overview", self
.curOverview
)
671 #---------------------------------------------
672 def OnSelChanged(self
, event
):
676 item
= event
.GetItem()
677 itemText
= self
.tree
.GetItemText(item
)
678 self
.RunDemo(itemText
)
681 #---------------------------------------------
682 def RunDemo(self
, itemText
):
684 if self
.nb
.GetPageCount() == 3:
685 if self
.nb
.GetSelection() == 2:
686 self
.nb
.SetSelection(0)
687 # inform the window that it's time to quit if it cares
688 if self
.window
is not None:
689 if hasattr(self
.window
, "ShutdownDemo"):
690 self
.window
.ShutdownDemo()
691 wx
.SafeYield() # in case the page has pending events
692 self
.nb
.DeletePage(2)
694 if itemText
== self
.overviewText
:
695 self
.LoadDemoSource('Main.py')
696 self
.SetOverview(self
.overviewText
, overview
)
700 if os
.path
.exists(itemText
+ '.py'):
702 wx
.LogMessage("Running demo %s.py..." % itemText
)
704 self
.LoadDemoSource(itemText
+ '.py')
706 if (sys
.modules
.has_key(itemText
)):
707 reload(sys
.modules
[itemText
])
709 module
= __import__(itemText
, globals())
710 self
.SetOverview(itemText
+ " Overview", module
.overview
)
715 self
.window
= module
.runTest(self
, self
.nb
, self
) ###
716 if self
.window
is not None:
717 self
.nb
.AddPage(self
.window
, 'Demo')
718 self
.nb
.SetSelection(2)
728 #---------------------------------------------
730 def LoadDemoSource(self
, filename
):
733 self
.txt
.SetValue(open(filename
).read())
735 self
.txt
.SetValue("Cannot open %s file." % filename
)
737 self
.txt
.SetInsertionPoint(0)
738 self
.txt
.ShowPosition(0)
740 #---------------------------------------------
741 def SetOverview(self
, name
, text
):
742 self
.curOverview
= text
744 if lead
!= '<html>' and lead
!= '<HTML>':
745 text
= '<br>'.join(text
.split('\n'))
746 self
.ovr
.SetPage(text
)
747 self
.nb
.SetPageText(0, name
)
749 #---------------------------------------------
751 def OnFileExit(self
, *event
):
754 def OnToggleRedirect(self
, event
):
758 print "Print statements and other standard output will now be directed to this window."
761 print "Print statements and other standard output will now be sent to the usual location."
763 def OnHelpAbout(self
, event
):
764 from About
import MyAboutBox
765 about
= MyAboutBox(self
)
769 def OnHelpFind(self
, event
):
770 self
.nb
.SetSelection(1)
771 self
.finddlg
= wx
.FindReplaceDialog(self
, self
.finddata
, "Find",
775 self
.finddlg
.Show(True)
777 def OnFind(self
, event
):
778 self
.nb
.SetSelection(1)
779 end
= self
.txt
.GetLastPosition()
780 textstring
= self
.txt
.GetRange(0, end
).lower()
781 start
= self
.txt
.GetSelection()[1]
782 findstring
= self
.finddata
.GetFindString().lower()
783 loc
= textstring
.find(findstring
, start
)
784 if loc
== -1 and start
!= 0:
785 # string not found, start at beginning
787 loc
= textstring
.find(findstring
, start
)
789 dlg
= wx
.MessageDialog(self
, 'Find String Not Found',
790 'Find String Not Found in Demo File',
791 wx
.OK | wx
.ICON_INFORMATION
)
796 self
.finddlg
.SetFocus()
799 self
.finddlg
.Destroy()
800 self
.txt
.ShowPosition(loc
)
801 self
.txt
.SetSelection(loc
, loc
+ len(findstring
))
805 def OnFindNext(self
, event
):
806 if self
.finddata
.GetFindString():
809 self
.OnHelpFind(event
)
811 def OnFindClose(self
, event
):
812 event
.GetDialog().Destroy()
815 #---------------------------------------------
816 def OnCloseWindow(self
, event
):
820 if hasattr(self
, "tbicon"):
825 #---------------------------------------------
826 def OnIdle(self
, event
):
828 self
.otherWin
.Raise()
829 self
.window
= self
.otherWin
833 #---------------------------------------------
836 showTipText
= open(opj("data/showTips")).read()
837 showTip
, index
= eval(showTipText
)
839 showTip
, index
= (1, 0)
841 tp
= wx
.CreateFileTipProvider(opj("data/tips.txt"), index
)
843 showTip
= wx
.ShowTip(self
, tp
)
844 index
= tp
.GetCurrentTip()
845 open(opj("data/showTips"), "w").write(str( (showTip
, index
) ))
848 #---------------------------------------------
849 def OnDemoMenu(self
, event
):
851 selectedDemo
= self
.treeMap
[self
.mainmenu
.GetLabel(event
.GetId())]
855 self
.tree
.SelectItem(selectedDemo
)
856 self
.tree
.EnsureVisible(selectedDemo
)
859 #---------------------------------------------
860 def OnTaskBarActivate(self
, evt
):
861 if self
.IsIconized():
863 if not self
.IsShown():
867 #---------------------------------------------
869 TBMENU_RESTORE
= 1000
872 def OnTaskBarMenu(self
, evt
):
874 menu
.Append(self
.TBMENU_RESTORE
, "Restore wxPython Demo")
875 menu
.Append(self
.TBMENU_CLOSE
, "Close")
876 self
.tbicon
.PopupMenu(menu
)
879 #---------------------------------------------
880 def OnTaskBarClose(self
, evt
):
883 # because of the way wx.TaskBarIcon.PopupMenu is implemented we have to
884 # prod the main idle handler a bit to get the window to actually close
885 wx
.GetApp().ProcessIdle()
888 #---------------------------------------------
889 def OnIconfiy(self
, evt
):
890 wx
.LogMessage("OnIconfiy")
893 #---------------------------------------------
894 def OnMaximize(self
, evt
):
895 wx
.LogMessage("OnMaximize")
901 #---------------------------------------------------------------------------
902 #---------------------------------------------------------------------------
904 class MySplashScreen(wx
.SplashScreen
):
906 bmp
= wx
.Image(opj("bitmaps/splash.gif")).ConvertToBitmap()
907 wx
.SplashScreen
.__init
__(self
, bmp
,
908 wx
.SPLASH_CENTRE_ON_SCREEN | wx
.SPLASH_TIMEOUT
,
910 self
.Bind(wx
.EVT_CLOSE
, self
.OnClose
)
912 def OnClose(self
, evt
):
914 frame
= wxPythonDemo(None, -1, "wxPython: (A Demonstration)")
916 evt
.Skip() # Make sure the default handler runs too...
922 Create and show the splash screen. It will then create and show
923 the main frame when it is time to do so.
926 wx
.InitAllImageHandlers()
928 # Normally when using a SplashScreen you would create it, show
929 # it and then continue on with the applicaiton's
930 # initialization, finally creating and showing the main
931 # application window(s). In this case we have nothing else to
932 # do so we'll delay showing the main frame until later (see
933 # OnClose above) so the users can see the SplashScrren effect.
934 splash
= MySplashScreen()
941 #---------------------------------------------------------------------------
945 demoPath
= os
.path
.dirname(__file__
)
949 app
= MyApp(0) ##wx.Platform == "__WXMAC__")
953 #---------------------------------------------------------------------------
957 overview
= """<html><body>
960 <p> wxPython is a <b>GUI toolkit</b> for the <a
961 href="http://www.python.org/">Python</a> programming language. It
962 allows Python programmers to create programs with a robust, highly
963 functional graphical user interface, simply and easily. It is
964 implemented as a Python extension module (native code) that wraps the
965 popular <a href="http://wxwindows.org/front.htm">wxWindows</a> cross
966 platform GUI library, which is written in C++.
968 <p> Like Python and wxWindows, wxPython is <b>Open Source</b> which
969 means that it is free for anyone to use and the source code is
970 available for anyone to look at and modify. Or anyone can contribute
971 fixes or enhancements to the project.
973 <p> wxPython is a <b>cross-platform</b> toolkit. This means that the
974 same program will run on multiple platforms without modification.
975 Currently supported platforms are 32-bit Microsoft Windows, most Unix
976 or unix-like systems, and Macintosh OS X. Since the language is
977 Python, wxPython programs are <b>simple, easy</b> to write and easy to
980 <p> <b>This demo</b> is not only a collection of test cases for
981 wxPython, but is also designed to help you learn about and how to use
982 wxPython. Each sample is listed in the tree control on the left.
983 When a sample is selected in the tree then a module is loaded and run
984 (usually in a tab of this notebook,) and the source code of the module
985 is loaded in another tab for you to browse and learn from.
990 #----------------------------------------------------------------------------
991 #----------------------------------------------------------------------------
993 if __name__
== '__main__':
996 #----------------------------------------------------------------------------