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', [
113 ('Custom Controls', [
126 # controls coming from other libraries
127 ('More Windows/Controls', [
128 #'RightTextCtrl', deprecated as we have wxTE_RIGHT now.
142 'MaskedEditControls',
158 # How to lay out the controls in a frame/dialog
168 'XmlResourceHandler',
169 'XmlResourceSubclass',
173 ('Process and Events', [
185 ('Clipboard and DnD', [
219 # need libs not coming with the demo
220 ('Objects using an external library', [
221 'ActiveXWrapper_Acrobat',
224 #'PlotCanvas', # deprecated, use PyPlot
228 ('Check out the samples dir too', [
235 #---------------------------------------------------------------------------
236 # Show how to derive a custom wxLog class
238 class MyLog(wx
.PyLog
):
239 def __init__(self
, textCtrl
, logTime
=0):
240 wx
.PyLog
.__init
__(self
)
242 self
.logTime
= logTime
244 def DoLogString(self
, message
, timeStamp
):
246 message
= time
.strftime("%X", time
.localtime(timeStamp
)) + \
249 self
.tc
.AppendText(message
+ '\n')
252 class MyTP(wx
.PyTipProvider
):
254 return "This is my tip"
256 #---------------------------------------------------------------------------
257 # A class to be used to display source code in the demo. Try using the
258 # wxSTC in the StyledTextCtrl_2 sample first, fall back to wxTextCtrl
259 # if there is an error, such as the stc module not being present.
265 from StyledTextCtrl_2
import PythonSTC
266 class DemoCodeViewer(PythonSTC
):
267 def __init__(self
, parent
, ID
):
268 PythonSTC
.__init
__(self
, parent
, ID
, wx
.BORDER_NONE
)
271 # Some methods to make it compatible with how the wxTextCtrl is used
272 def SetValue(self
, value
):
273 self
.SetReadOnly(False)
275 self
.SetReadOnly(True)
280 def SetInsertionPoint(self
, pos
):
281 self
.SetCurrentPos(pos
)
283 def ShowPosition(self
, pos
):
286 def GetLastPosition(self
):
287 return self
.GetLength()
289 def GetRange(self
, start
, end
):
290 return self
.GetTextRange(start
, end
)
292 def GetSelection(self
):
293 return self
.GetAnchor(), self
.GetCurrentPos()
295 def SetSelection(self
, start
, end
):
296 self
.SetSelectionStart(start
)
297 self
.SetSelectionEnd(end
)
299 def SetUpEditor(self
):
301 This method carries out the work of setting up the demo editor.
302 It's seperate so as not to clutter up the init code.
306 self
.SetLexer(stc
.STC_LEX_PYTHON
)
307 self
.SetKeyWords(0, " ".join(keyword
.kwlist
))
310 self
.SetProperty("fold", "1" )
312 # Highlight tab/space mixing (shouldn't be any)
313 self
.SetProperty("tab.timmy.whinge.level", "1")
315 # Set left and right margins
318 # Set up the numbers in the margin for margin #1
319 self
.SetMarginType(1, wx
.stc
.STC_MARGIN_NUMBER
)
320 # Reasonable value for, say, 4-5 digits using a mono font (40 pix)
321 self
.SetMarginWidth(1, 40)
323 # Indentation and tab stuff
324 self
.SetIndent(4) # Proscribed indent size for wx
325 self
.SetIndentationGuides(True) # Show indent guides
326 self
.SetBackSpaceUnIndents(True)# Backspace unindents rather than delete 1 space
327 self
.SetTabIndents(True) # Tab key indents
328 self
.SetTabWidth(4) # Proscribed tab size for wx
329 self
.SetUseTabs(False) # Use spaces rather than tabs, or
330 # TabTimmy will complain!
332 self
.SetViewWhiteSpace(False) # Don't view white space
335 #self.SetEOLMode(wx.stc.STC_EOL_CRLF) # Just leave it at the default (autosense)
336 self
.SetViewEOL(False)
337 # No right-edge mode indicator
338 self
.SetEdgeMode(stc
.STC_EDGE_NONE
)
340 # Setup a margin to hold fold markers
341 self
.SetMarginType(2, stc
.STC_MARGIN_SYMBOL
)
342 self
.SetMarginMask(2, stc
.STC_MASK_FOLDERS
)
343 self
.SetMarginSensitive(2, True)
344 self
.SetMarginWidth(2, 12)
346 # and now set up the fold markers
347 self
.MarkerDefine(stc
.STC_MARKNUM_FOLDEREND
, stc
.STC_MARK_BOXPLUSCONNECTED
, "white", "black")
348 self
.MarkerDefine(stc
.STC_MARKNUM_FOLDEROPENMID
, stc
.STC_MARK_BOXMINUSCONNECTED
, "white", "black")
349 self
.MarkerDefine(stc
.STC_MARKNUM_FOLDERMIDTAIL
, stc
.STC_MARK_TCORNER
, "white", "black")
350 self
.MarkerDefine(stc
.STC_MARKNUM_FOLDERTAIL
, stc
.STC_MARK_LCORNER
, "white", "black")
351 self
.MarkerDefine(stc
.STC_MARKNUM_FOLDERSUB
, stc
.STC_MARK_VLINE
, "white", "black")
352 self
.MarkerDefine(stc
.STC_MARKNUM_FOLDER
, stc
.STC_MARK_BOXPLUS
, "white", "black")
353 self
.MarkerDefine(stc
.STC_MARKNUM_FOLDEROPEN
, stc
.STC_MARK_BOXMINUS
, "white", "black")
355 # Global default style
356 if wx
.Platform
== '__WXMSW__':
357 self
.StyleSetSpec(stc
.STC_STYLE_DEFAULT
,
358 'fore:#000000,back:#FFFFFF,face:Courier New,size:9')
360 self
.StyleSetSpec(stc
.STC_STYLE_DEFAULT
,
361 'fore:#000000,back:#FFFFFF,face:Courier,size:12')
363 # Clear styles and revert to default.
366 # Following style specs only indicate differences from default.
367 # The rest remains unchanged.
369 # Line numbers in margin
370 self
.StyleSetSpec(wx
.stc
.STC_STYLE_LINENUMBER
,'fore:#000000,back:#99A9C2')
373 self
.StyleSetSpec(wx
.stc
.STC_STYLE_BRACELIGHT
,'fore:#00009D,back:#FFFF00')
375 self
.StyleSetSpec(wx
.stc
.STC_STYLE_BRACEBAD
,'fore:#00009D,back:#FF0000')
377 self
.StyleSetSpec(wx
.stc
.STC_STYLE_INDENTGUIDE
, "fore:#CDCDCD")
380 self
.StyleSetSpec(wx
.stc
.STC_P_DEFAULT
, 'fore:#000000')
382 self
.StyleSetSpec(wx
.stc
.STC_P_COMMENTLINE
, 'fore:#008000,back:#F0FFF0')
383 self
.StyleSetSpec(wx
.stc
.STC_P_COMMENTBLOCK
, 'fore:#008000,back:#F0FFF0')
385 self
.StyleSetSpec(wx
.stc
.STC_P_NUMBER
, 'fore:#008080')
386 # Strings and characters
387 self
.StyleSetSpec(wx
.stc
.STC_P_STRING
, 'fore:#800080')
388 self
.StyleSetSpec(wx
.stc
.STC_P_CHARACTER
, 'fore:#800080')
390 self
.StyleSetSpec(wx
.stc
.STC_P_WORD
, 'fore:#000080,bold')
392 self
.StyleSetSpec(wx
.stc
.STC_P_TRIPLE
, 'fore:#800080,back:#FFFFEA')
393 self
.StyleSetSpec(wx
.stc
.STC_P_TRIPLEDOUBLE
, 'fore:#800080,back:#FFFFEA')
395 self
.StyleSetSpec(wx
.stc
.STC_P_CLASSNAME
, 'fore:#0000FF,bold')
397 self
.StyleSetSpec(wx
.stc
.STC_P_DEFNAME
, 'fore:#008080,bold')
399 self
.StyleSetSpec(wx
.stc
.STC_P_OPERATOR
, 'fore:#800000,bold')
400 # Identifiers. I leave this as not bold because everything seems
401 # to be an identifier if it doesn't match the above criterae
402 self
.StyleSetSpec(wx
.stc
.STC_P_IDENTIFIER
, 'fore:#000000')
405 self
.SetCaretForeground("BLUE")
406 # Selection background
407 self
.SetSelBackground(1, '#66CCFF')
409 self
.SetSelBackground(True, wx
.SystemSettings_GetColour(wx
.SYS_COLOUR_HIGHLIGHT
))
410 self
.SetSelForeground(True, wx
.SystemSettings_GetColour(wx
.SYS_COLOUR_HIGHLIGHTTEXT
))
414 class DemoCodeViewer(wx
.TextCtrl
):
415 def __init__(self
, parent
, ID
):
416 wx
.TextCtrl
.__init
__(self
, parent
, ID
, style
=
417 wx
.TE_MULTILINE | wx
.TE_READONLY |
418 wx
.HSCROLL | wx
.TE_RICH2 | wx
.TE_NOHIDESEL
)
421 #---------------------------------------------------------------------------
424 """Convert paths to the platform-specific separator"""
425 return apply(os
.path
.join
, tuple(path
.split('/')))
428 #---------------------------------------------------------------------------
430 class wxPythonDemo(wx
.Frame
):
431 overviewText
= "wxPython Overview"
433 def __init__(self
, parent
, id, title
):
434 wx
.Frame
.__init
__(self
, parent
, -1, title
, size
= (800, 600),
435 style
=wx
.DEFAULT_FRAME_STYLE|wx
.NO_FULL_REPAINT_ON_RESIZE
)
438 self
.cwd
= os
.getcwd()
439 self
.curOverview
= ""
442 icon
= images
.getMondrianIcon()
445 if wx
.Platform
!= '__WXMAC__':
446 # setup a taskbar icon, and catch some events from it
447 icon
= wx
.IconFromBitmap(
448 images
.getMondrianImage().Scale(16,16).ConvertToBitmap() )
449 self
.tbicon
= wx
.TaskBarIcon()
450 self
.tbicon
.SetIcon(icon
, "wxPython Demo")
451 self
.tbicon
.Bind(wx
.EVT_TASKBAR_LEFT_DCLICK
, self
.OnTaskBarActivate
)
452 self
.tbicon
.Bind(wx
.EVT_TASKBAR_RIGHT_UP
, self
.OnTaskBarMenu
)
453 self
.tbicon
.Bind(wx
.EVT_MENU
, self
.OnTaskBarActivate
, id=self
.TBMENU_RESTORE
)
454 self
.tbicon
.Bind(wx
.EVT_MENU
, self
.OnTaskBarClose
, id=self
.TBMENU_CLOSE
)
456 wx
.CallAfter(self
.ShowTip
)
459 self
.Bind(wx
.EVT_IDLE
, self
.OnIdle
)
460 self
.Bind(wx
.EVT_CLOSE
, self
.OnCloseWindow
)
461 self
.Bind(wx
.EVT_ICONIZE
, self
.OnIconfiy
)
462 self
.Bind(wx
.EVT_MAXIMIZE
, self
.OnMaximize
)
465 self
.CreateStatusBar(1, wx
.ST_SIZEGRIP
)
467 splitter
= wx
.SplitterWindow(self
, -1)
468 splitter2
= wx
.SplitterWindow(splitter
, -1) ##, size=(20,20))
470 # Set up a log on the View Log Notebook page
471 self
.log
= wx
.TextCtrl(splitter2
, -1,
472 style
= wx
.TE_MULTILINE|wx
.TE_READONLY|wx
.HSCROLL
)
474 # Set the wxWindows log target to be this textctrl
475 #wx.Log_SetActiveTarget(wx.LogTextCtrl(self.log))
477 # But instead of the above we want to show how to use our own wx.Log class
478 wx
.Log_SetActiveTarget(MyLog(self
.log
))
480 # for serious debugging
481 #wx.Log_SetActiveTarget(wx.LogStderr())
482 #wx.Log_SetTraceMask(wx.TraceMessages)
486 def EmptyHandler(evt
): pass
487 #splitter.Bind(wx.EVT_ERASE_BACKGROUND, EmptyHandler)
488 #splitter2.Bind(wx.EVT_ERASE_BACKGROUND, EmptyHandler)
490 # Prevent TreeCtrl from displaying all items after destruction when True
494 self
.mainmenu
= wx
.MenuBar()
496 item
= menu
.Append(-1, '&Redirect Output',
497 'Redirect print statements to a window',
499 self
.Bind(wx
.EVT_MENU
, self
.OnToggleRedirect
, item
)
501 item
= menu
.Append(-1, 'E&xit\tAlt-X', 'Get the heck outta here!')
502 self
.Bind(wx
.EVT_MENU
, self
.OnFileExit
, item
)
503 wx
.App_SetMacExitMenuItemId(item
.GetId())
505 self
.mainmenu
.Append(menu
, '&File')
509 for item
in _treeList
:
511 for childItem
in item
[1]:
512 mi
= submenu
.Append(-1, childItem
)
513 self
.Bind(wx
.EVT_MENU
, self
.OnDemoMenu
, mi
)
514 menu
.AppendMenu(wx
.NewId(), item
[0], submenu
)
515 self
.mainmenu
.Append(menu
, '&Demo')
521 findnextID
= wx
.NewId()
523 findItem
= menu
.Append(-1, '&Find\tCtrl-F', 'Find in the Demo Code')
524 findnextItem
= menu
.Append(-1, 'Find &Next\tF3', 'Find Next')
525 menu
.AppendSeparator()
526 helpItem
= menu
.Append(-1, '&About\tCtrl-H', 'wxPython RULES!!!')
527 wx
.App_SetMacAboutMenuItemId(helpItem
.GetId())
528 self
.Bind(wx
.EVT_MENU
, self
.OnHelpAbout
, helpItem
)
529 self
.Bind(wx
.EVT_MENU
, self
.OnHelpFind
, findItem
)
530 self
.Bind(wx
.EVT_MENU
, self
.OnFindNext
, findnextItem
)
531 self
.Bind(wx
.EVT_COMMAND_FIND
, self
.OnFind
)
532 self
.Bind(wx
.EVT_COMMAND_FIND_NEXT
, self
.OnFind
)
533 self
.Bind(wx
.EVT_COMMAND_FIND_CLOSE
, self
.OnFindClose
)
534 self
.mainmenu
.Append(menu
, '&Help')
535 self
.SetMenuBar(self
.mainmenu
)
537 self
.finddata
= wx
.FindReplaceData()
540 # This is another way to set Accelerators, in addition to
541 # using the '\t<key>' syntax in the menu items.
542 aTable
= wx
.AcceleratorTable([(wx
.ACCEL_ALT
, ord('X'), exitID
),
543 (wx
.ACCEL_CTRL
, ord('H'), helpID
),
544 (wx
.ACCEL_CTRL
, ord('F'), findID
),
545 (wx
.ACCEL_NORMAL
, WXK_F3
, findnextID
)
547 self
.SetAcceleratorTable(aTable
)
553 self
.tree
= wx
.TreeCtrl(splitter
, tID
, style
=
554 wx
.TR_DEFAULT_STYLE
#| wx.TR_HAS_VARIABLE_ROW_HEIGHT
557 root
= self
.tree
.AddRoot("wxPython Overview")
559 for item
in _treeList
:
560 child
= self
.tree
.AppendItem(root
, item
[0])
561 if not firstChild
: firstChild
= child
562 for childItem
in item
[1]:
563 theDemo
= self
.tree
.AppendItem(child
, childItem
)
564 self
.treeMap
[childItem
] = theDemo
566 self
.tree
.Expand(root
)
567 self
.tree
.Expand(firstChild
)
568 self
.tree
.Bind(wx
.EVT_TREE_ITEM_EXPANDED
, self
.OnItemExpanded
, id=tID
)
569 self
.tree
.Bind(wx
.EVT_TREE_ITEM_COLLAPSED
, self
.OnItemCollapsed
, id=tID
)
570 self
.tree
.Bind(wx
.EVT_TREE_SEL_CHANGED
, self
.OnSelChanged
, id=tID
)
571 self
.tree
.Bind(wx
.EVT_LEFT_DOWN
, self
.OnTreeLeftDown
)
574 self
.nb
= wx
.Notebook(splitter2
, -1, style
=wx
.CLIP_CHILDREN
)
576 # Set up a wx.html.HtmlWindow on the Overview Notebook page
577 # we put it in a panel first because there seems to be a
578 # refresh bug of some sort (wxGTK) when it is directly in
581 self
.ovr
= wx
.html
.HtmlWindow(self
.nb
, -1, size
=(400, 400))
582 self
.nb
.AddPage(self
.ovr
, self
.overviewText
)
584 else: # hopefully I can remove this hacky code soon, see SF bug #216861
585 panel
= wx
.Panel(self
.nb
, -1, style
=wx
.CLIP_CHILDREN
)
586 self
.ovr
= wx
.html
.HtmlWindow(panel
, -1, size
=(400, 400))
587 self
.nb
.AddPage(panel
, self
.overviewText
)
589 def OnOvrSize(evt
, ovr
=self
.ovr
):
590 ovr
.SetSize(evt
.GetSize())
592 panel
.Bind(wx
.EVT_SIZE
, OnOvrSize
)
593 panel
.Bind(wx
.EVT_ERASE_BACKGROUND
, EmptyHandler
)
596 self
.SetOverview(self
.overviewText
, overview
)
599 # Set up a notebook page for viewing the source code of each sample
600 self
.txt
= DemoCodeViewer(self
.nb
, -1)
601 self
.nb
.AddPage(self
.txt
, "Demo Code")
602 self
.LoadDemoSource('Main.py')
605 # add the windows to the splitter and split it.
606 splitter2
.SplitHorizontally(self
.nb
, self
.log
, -120)
607 splitter
.SplitVertically(self
.tree
, splitter2
, 180)
609 splitter
.SetMinimumPaneSize(20)
610 splitter2
.SetMinimumPaneSize(20)
613 # Make the splitter on the right expand the top window when resized
614 def SplitterOnSize(evt
):
615 splitter
= evt
.GetEventObject()
616 sz
= splitter
.GetSize()
617 splitter
.SetSashPosition(sz
.height
- 120, False)
620 splitter2
.Bind(wx
.EVT_SIZE
, SplitterOnSize
)
623 # select initial items
624 self
.nb
.SetSelection(0)
625 self
.tree
.SelectItem(root
)
627 if len(sys
.argv
) == 2:
629 selectedDemo
= self
.treeMap
[sys
.argv
[1]]
633 self
.tree
.SelectItem(selectedDemo
)
634 self
.tree
.EnsureVisible(selectedDemo
)
637 wx
.LogMessage('window handle: %s' % self
.GetHandle())
640 #---------------------------------------------
641 def WriteText(self
, text
):
642 if text
[-1:] == '\n':
647 def write(self
, txt
):
650 #---------------------------------------------
651 def OnItemExpanded(self
, event
):
652 item
= event
.GetItem()
653 wx
.LogMessage("OnItemExpanded: %s" % self
.tree
.GetItemText(item
))
656 #---------------------------------------------
657 def OnItemCollapsed(self
, event
):
658 item
= event
.GetItem()
659 wx
.LogMessage("OnItemCollapsed: %s" % self
.tree
.GetItemText(item
))
662 #---------------------------------------------
663 def OnTreeLeftDown(self
, event
):
664 pt
= event
.GetPosition();
665 item
, flags
= self
.tree
.HitTest(pt
)
666 if item
== self
.tree
.GetSelection():
667 self
.SetOverview(self
.tree
.GetItemText(item
)+" Overview", self
.curOverview
)
670 #---------------------------------------------
671 def OnSelChanged(self
, event
):
675 item
= event
.GetItem()
676 itemText
= self
.tree
.GetItemText(item
)
677 self
.RunDemo(itemText
)
680 #---------------------------------------------
681 def RunDemo(self
, itemText
):
683 if self
.nb
.GetPageCount() == 3:
684 if self
.nb
.GetSelection() == 2:
685 self
.nb
.SetSelection(0)
686 # inform the window that it's time to quit if it cares
687 if self
.window
is not None:
688 if hasattr(self
.window
, "ShutdownDemo"):
689 self
.window
.ShutdownDemo()
690 wx
.SafeYield() # in case the page has pending events
691 self
.nb
.DeletePage(2)
693 if itemText
== self
.overviewText
:
694 self
.LoadDemoSource('Main.py')
695 self
.SetOverview(self
.overviewText
, overview
)
699 if os
.path
.exists(itemText
+ '.py'):
701 wx
.LogMessage("Running demo %s.py..." % itemText
)
703 self
.LoadDemoSource(itemText
+ '.py')
705 if (sys
.modules
.has_key(itemText
)):
706 reload(sys
.modules
[itemText
])
708 module
= __import__(itemText
, globals())
709 self
.SetOverview(itemText
+ " Overview", module
.overview
)
714 self
.window
= module
.runTest(self
, self
.nb
, self
) ###
715 if self
.window
is not None:
716 self
.nb
.AddPage(self
.window
, 'Demo')
717 self
.nb
.SetSelection(2)
726 #---------------------------------------------
728 def LoadDemoSource(self
, filename
):
731 self
.txt
.SetValue(open(filename
).read())
733 self
.txt
.SetValue("Cannot open %s file." % filename
)
735 self
.txt
.SetInsertionPoint(0)
736 self
.txt
.ShowPosition(0)
738 #---------------------------------------------
739 def SetOverview(self
, name
, text
):
740 self
.curOverview
= text
742 if lead
!= '<html>' and lead
!= '<HTML>':
743 text
= '<br>'.join(text
.split('\n'))
744 self
.ovr
.SetPage(text
)
745 self
.nb
.SetPageText(0, name
)
747 #---------------------------------------------
749 def OnFileExit(self
, *event
):
752 def OnToggleRedirect(self
, event
):
756 print "Print statements and other standard output will now be directed to this window."
759 print "Print statements and other standard output will now be sent to the usual location."
761 def OnHelpAbout(self
, event
):
762 from About
import MyAboutBox
763 about
= MyAboutBox(self
)
767 def OnHelpFind(self
, event
):
768 self
.nb
.SetSelection(1)
769 self
.finddlg
= wx
.FindReplaceDialog(self
, self
.finddata
, "Find",
773 self
.finddlg
.Show(True)
775 def OnFind(self
, event
):
776 self
.nb
.SetSelection(1)
777 end
= self
.txt
.GetLastPosition()
778 textstring
= self
.txt
.GetRange(0, end
).lower()
779 start
= self
.txt
.GetSelection()[1]
780 findstring
= self
.finddata
.GetFindString().lower()
781 loc
= textstring
.find(findstring
, start
)
782 if loc
== -1 and start
!= 0:
783 # string not found, start at beginning
785 loc
= textstring
.find(findstring
, start
)
787 dlg
= wx
.MessageDialog(self
, 'Find String Not Found',
788 'Find String Not Found in Demo File',
789 wx
.OK | wx
.ICON_INFORMATION
)
794 self
.finddlg
.SetFocus()
797 self
.finddlg
.Destroy()
798 self
.txt
.ShowPosition(loc
)
799 self
.txt
.SetSelection(loc
, loc
+ len(findstring
))
803 def OnFindNext(self
, event
):
804 if self
.finddata
.GetFindString():
807 self
.OnHelpFind(event
)
809 def OnFindClose(self
, event
):
810 event
.GetDialog().Destroy()
813 #---------------------------------------------
814 def OnCloseWindow(self
, event
):
818 if hasattr(self
, "tbicon"):
823 #---------------------------------------------
824 def OnIdle(self
, event
):
826 self
.otherWin
.Raise()
827 self
.window
= self
.otherWin
831 #---------------------------------------------
834 showTipText
= open(opj("data/showTips")).read()
835 showTip
, index
= eval(showTipText
)
837 showTip
, index
= (1, 0)
839 tp
= wx
.CreateFileTipProvider(opj("data/tips.txt"), index
)
841 showTip
= wx
.ShowTip(self
, tp
)
842 index
= tp
.GetCurrentTip()
843 open(opj("data/showTips"), "w").write(str( (showTip
, index
) ))
846 #---------------------------------------------
847 def OnDemoMenu(self
, event
):
849 selectedDemo
= self
.treeMap
[self
.mainmenu
.GetLabel(event
.GetId())]
853 self
.tree
.SelectItem(selectedDemo
)
854 self
.tree
.EnsureVisible(selectedDemo
)
857 #---------------------------------------------
858 def OnTaskBarActivate(self
, evt
):
859 if self
.IsIconized():
861 if not self
.IsShown():
865 #---------------------------------------------
867 TBMENU_RESTORE
= 1000
870 def OnTaskBarMenu(self
, evt
):
872 menu
.Append(self
.TBMENU_RESTORE
, "Restore wxPython Demo")
873 menu
.Append(self
.TBMENU_CLOSE
, "Close")
874 self
.tbicon
.PopupMenu(menu
)
877 #---------------------------------------------
878 def OnTaskBarClose(self
, evt
):
881 # because of the way wx.TaskBarIcon.PopupMenu is implemented we have to
882 # prod the main idle handler a bit to get the window to actually close
883 wx
.GetApp().ProcessIdle()
886 #---------------------------------------------
887 def OnIconfiy(self
, evt
):
888 wx
.LogMessage("OnIconfiy")
891 #---------------------------------------------
892 def OnMaximize(self
, evt
):
893 wx
.LogMessage("OnMaximize")
899 #---------------------------------------------------------------------------
900 #---------------------------------------------------------------------------
902 class MySplashScreen(wx
.SplashScreen
):
904 bmp
= wx
.Image(opj("bitmaps/splash.gif")).ConvertToBitmap()
905 wx
.SplashScreen
.__init
__(self
, bmp
,
906 wx
.SPLASH_CENTRE_ON_SCREEN | wx
.SPLASH_TIMEOUT
,
908 self
.Bind(wx
.EVT_CLOSE
, self
.OnClose
)
910 def OnClose(self
, evt
):
912 frame
= wxPythonDemo(None, -1, "wxPython: (A Demonstration)")
914 evt
.Skip() # Make sure the default handler runs too...
920 Create and show the splash screen. It will then create and show
921 the main frame when it is time to do so.
924 wx
.InitAllImageHandlers()
926 # Normally when using a SplashScreen you would create it, show
927 # it and then continue on with the applicaiton's
928 # initialization, finally creating and showing the main
929 # application window(s). In this case we have nothing else to
930 # do so we'll delay showing the main frame until later (see
931 # OnClose above) so the users can see the SplashScrren effect.
932 splash
= MySplashScreen()
939 #---------------------------------------------------------------------------
943 demoPath
= os
.path
.dirname(__file__
)
947 app
= MyApp(0) ##wx.Platform == "__WXMAC__")
951 #---------------------------------------------------------------------------
955 overview
= """<html><body>
958 <p> wxPython is a <b>GUI toolkit</b> for the <a
959 href="http://www.python.org/">Python</a> programming language. It
960 allows Python programmers to create programs with a robust, highly
961 functional graphical user interface, simply and easily. It is
962 implemented as a Python extension module (native code) that wraps the
963 popular <a href="http://wxwindows.org/front.htm">wxWindows</a> cross
964 platform GUI library, which is written in C++.
966 <p> Like Python and wxWindows, wxPython is <b>Open Source</b> which
967 means that it is free for anyone to use and the source code is
968 available for anyone to look at and modify. Or anyone can contribute
969 fixes or enhancements to the project.
971 <p> wxPython is a <b>cross-platform</b> toolkit. This means that the
972 same program will run on multiple platforms without modification.
973 Currently supported platforms are 32-bit Microsoft Windows, most Unix
974 or unix-like systems, and Macintosh OS X. Since the language is
975 Python, wxPython programs are <b>simple, easy</b> to write and easy to
978 <p> <b>This demo</b> is not only a collection of test cases for
979 wxPython, but is also designed to help you learn about and how to use
980 wxPython. Each sample is listed in the tree control on the left.
981 When a sample is selected in the tree then a module is loaded and run
982 (usually in a tab of this notebook,) and the source code of the module
983 is loaded in another tab for you to browse and learn from.
988 #----------------------------------------------------------------------------
989 #----------------------------------------------------------------------------
991 if __name__
== '__main__':
994 #----------------------------------------------------------------------------