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
23 ##print os.getpid(); raw_input("Press a key...")
26 #---------------------------------------------------------------------------
31 ('Recent Additions', [
36 'XmlResourceSubclass',
42 # managed windows == things with a (optional) caption you can close
43 ('Base Frames and Dialogs', [
67 # dialogs from libraries
71 'MultipleChoiceDialog',
72 'ScrolledMessageDialog',
76 ('Core Windows/Controls', [
111 ('Custom Controls', [
124 # controls coming from other libraries
125 ('More Windows/Controls', [
126 #'RightTextCtrl', deprecated as we have wxTE_RIGHT now.
140 'MaskedEditControls',
156 # How to lay out the controls in a frame/dialog
166 'XmlResourceHandler',
167 'XmlResourceSubclass',
171 ('Process and Events', [
183 ('Clipboard and DnD', [
216 # need libs not coming with the demo
217 ('Objects using an external library', [
218 'ActiveXWrapper_Acrobat',
221 #'PlotCanvas', # deprecated, use PyPlot
225 ('Check out the samples dir too', [
232 #---------------------------------------------------------------------------
233 # Show how to derive a custom wxLog class
235 class MyLog(wx
.PyLog
):
236 def __init__(self
, textCtrl
, logTime
=0):
237 wx
.PyLog
.__init
__(self
)
239 self
.logTime
= logTime
241 def DoLogString(self
, message
, timeStamp
):
243 message
= time
.strftime("%X", time
.localtime(timeStamp
)) + \
246 self
.tc
.AppendText(message
+ '\n')
249 class MyTP(wx
.PyTipProvider
):
251 return "This is my tip"
253 #---------------------------------------------------------------------------
254 # A class to be used to display source code in the demo. Try using the
255 # wxSTC in the StyledTextCtrl_2 sample first, fall back to wxTextCtrl
256 # if there is an error, such as the stc module not being present.
262 from StyledTextCtrl_2
import PythonSTC
263 class DemoCodeViewer(PythonSTC
):
264 def __init__(self
, parent
, ID
):
265 PythonSTC
.__init
__(self
, parent
, ID
)
268 # Some methods to make it compatible with how the wxTextCtrl is used
269 def SetValue(self
, value
):
270 self
.SetReadOnly(False)
272 self
.SetReadOnly(True)
277 def SetInsertionPoint(self
, pos
):
278 self
.SetCurrentPos(pos
)
280 def ShowPosition(self
, pos
):
283 def GetLastPosition(self
):
284 return self
.GetLength()
286 def GetRange(self
, start
, end
):
287 return self
.GetTextRange(start
, end
)
289 def GetSelection(self
):
290 return self
.GetAnchor(), self
.GetCurrentPos()
292 def SetSelection(self
, start
, end
):
293 self
.SetSelectionStart(start
)
294 self
.SetSelectionEnd(end
)
296 def SetUpEditor(self
):
298 This method carries out the work of setting up the demo editor.
299 It's seperate so as not to clutter up the init code.
303 self
.SetLexer(stc
.STC_LEX_PYTHON
)
304 self
.SetKeyWords(0, " ".join(keyword
.kwlist
))
307 self
.SetProperty("fold", "1" )
309 # Highlight tab/space mixing (shouldn't be any)
310 self
.SetProperty("tab.timmy.whinge.level", "1")
312 # Set left and right margins
315 # Set up the numbers in the margin for margin #1
316 self
.SetMarginType(1, wx
.stc
.STC_MARGIN_NUMBER
)
317 # Reasonable value for, say, 4-5 digits using a mono font (40 pix)
318 self
.SetMarginWidth(1, 40)
320 # Indentation and tab stuff
321 self
.SetIndent(4) # Proscribed indent size for wx
322 self
.SetIndentationGuides(True) # Show indent guides
323 self
.SetBackSpaceUnIndents(True)# Backspace unindents rather than delete 1 space
324 self
.SetTabIndents(True) # Tab key indents
325 self
.SetTabWidth(4) # Proscribed tab size for wx
326 self
.SetUseTabs(False) # Use spaces rather than tabs, or
327 # TabTimmy will complain!
329 self
.SetViewWhiteSpace(False) # Don't view white space
332 #self.SetEOLMode(wx.stc.STC_EOL_CRLF) # Just leave it at the default (autosense)
333 self
.SetViewEOL(False)
334 # No right-edge mode indicator
335 self
.SetEdgeMode(stc
.STC_EDGE_NONE
)
337 # Setup a margin to hold fold markers
338 self
.SetMarginType(2, stc
.STC_MARGIN_SYMBOL
)
339 self
.SetMarginMask(2, stc
.STC_MASK_FOLDERS
)
340 self
.SetMarginSensitive(2, True)
341 self
.SetMarginWidth(2, 12)
343 # and now set up the fold markers
344 self
.MarkerDefine(stc
.STC_MARKNUM_FOLDEREND
, stc
.STC_MARK_BOXPLUSCONNECTED
, "white", "black")
345 self
.MarkerDefine(stc
.STC_MARKNUM_FOLDEROPENMID
, stc
.STC_MARK_BOXMINUSCONNECTED
, "white", "black")
346 self
.MarkerDefine(stc
.STC_MARKNUM_FOLDERMIDTAIL
, stc
.STC_MARK_TCORNER
, "white", "black")
347 self
.MarkerDefine(stc
.STC_MARKNUM_FOLDERTAIL
, stc
.STC_MARK_LCORNER
, "white", "black")
348 self
.MarkerDefine(stc
.STC_MARKNUM_FOLDERSUB
, stc
.STC_MARK_VLINE
, "white", "black")
349 self
.MarkerDefine(stc
.STC_MARKNUM_FOLDER
, stc
.STC_MARK_BOXPLUS
, "white", "black")
350 self
.MarkerDefine(stc
.STC_MARKNUM_FOLDEROPEN
, stc
.STC_MARK_BOXMINUS
, "white", "black")
352 # Global default style
353 if wx
.Platform
== '__WXMSW__':
354 self
.StyleSetSpec(stc
.STC_STYLE_DEFAULT
,
355 'fore:#000000,back:#FFFFFF,face:Courier New,size:9')
357 self
.StyleSetSpec(stc
.STC_STYLE_DEFAULT
,
358 'fore:#000000,back:#FFFFFF,face:Courier,size:12')
360 # Clear styles and revert to default.
363 # Following style specs only indicate differences from default.
364 # The rest remains unchanged.
366 # Line numbers in margin
367 self
.StyleSetSpec(wx
.stc
.STC_STYLE_LINENUMBER
,'fore:#000000,back:#99A9C2')
370 self
.StyleSetSpec(wx
.stc
.STC_STYLE_BRACELIGHT
,'fore:#00009D,back:#FFFF00')
372 self
.StyleSetSpec(wx
.stc
.STC_STYLE_BRACEBAD
,'fore:#00009D,back:#FF0000')
374 self
.StyleSetSpec(wx
.stc
.STC_STYLE_INDENTGUIDE
, "fore:#CDCDCD")
377 self
.StyleSetSpec(wx
.stc
.STC_P_DEFAULT
, 'fore:#000000')
379 self
.StyleSetSpec(wx
.stc
.STC_P_COMMENTLINE
, 'fore:#008000,back:#F0FFF0')
380 self
.StyleSetSpec(wx
.stc
.STC_P_COMMENTBLOCK
, 'fore:#008000,back:#F0FFF0')
382 self
.StyleSetSpec(wx
.stc
.STC_P_NUMBER
, 'fore:#008080')
383 # Strings and characters
384 self
.StyleSetSpec(wx
.stc
.STC_P_STRING
, 'fore:#800080')
385 self
.StyleSetSpec(wx
.stc
.STC_P_CHARACTER
, 'fore:#800080')
387 self
.StyleSetSpec(wx
.stc
.STC_P_WORD
, 'fore:#000080,bold')
389 self
.StyleSetSpec(wx
.stc
.STC_P_TRIPLE
, 'fore:#800080,back:#FFFFEA')
390 self
.StyleSetSpec(wx
.stc
.STC_P_TRIPLEDOUBLE
, 'fore:#800080,back:#FFFFEA')
392 self
.StyleSetSpec(wx
.stc
.STC_P_CLASSNAME
, 'fore:#0000FF,bold')
394 self
.StyleSetSpec(wx
.stc
.STC_P_DEFNAME
, 'fore:#008080,bold')
396 self
.StyleSetSpec(wx
.stc
.STC_P_OPERATOR
, 'fore:#800000,bold')
397 # Identifiers. I leave this as not bold because everything seems
398 # to be an identifier if it doesn't match the above criterae
399 self
.StyleSetSpec(wx
.stc
.STC_P_IDENTIFIER
, 'fore:#000000')
402 self
.SetCaretForeground("BLUE")
403 # Selection background
404 self
.SetSelBackground(1, '#66CCFF')
406 self
.SetSelBackground(True, wx
.SystemSettings_GetColour(wx
.SYS_COLOUR_HIGHLIGHT
))
407 self
.SetSelForeground(True, wx
.SystemSettings_GetColour(wx
.SYS_COLOUR_HIGHLIGHTTEXT
))
411 class DemoCodeViewer(wx
.TextCtrl
):
412 def __init__(self
, parent
, ID
):
413 wx
.TextCtrl
.__init
__(self
, parent
, ID
, style
=
414 wx
.TE_MULTILINE | wx
.TE_READONLY |
415 wx
.HSCROLL | wx
.TE_RICH2 | wx
.TE_NOHIDESEL
)
418 #---------------------------------------------------------------------------
421 """Convert paths to the platform-specific separator"""
422 return apply(os
.path
.join
, tuple(path
.split('/')))
425 #---------------------------------------------------------------------------
427 class wxPythonDemo(wx
.Frame
):
428 overviewText
= "wxPython Overview"
430 def __init__(self
, parent
, id, title
):
431 wx
.Frame
.__init
__(self
, parent
, -1, title
, size
= (800, 600),
432 style
=wx
.DEFAULT_FRAME_STYLE|wx
.NO_FULL_REPAINT_ON_RESIZE
)
434 self
.cwd
= os
.getcwd()
435 self
.curOverview
= ""
438 icon
= images
.getMondrianIcon()
441 if wx
.Platform
!= '__WXMAC__':
442 # setup a taskbar icon, and catch some events from it
443 icon
= wx
.IconFromBitmap(
444 images
.getMondrianImage().Scale(16,16).ConvertToBitmap() )
445 self
.tbicon
= wx
.TaskBarIcon()
446 self
.tbicon
.SetIcon(icon
, "wxPython Demo")
447 self
.tbicon
.Bind(wx
.EVT_TASKBAR_LEFT_DCLICK
, self
.OnTaskBarActivate
)
448 self
.tbicon
.Bind(wx
.EVT_TASKBAR_RIGHT_UP
, self
.OnTaskBarMenu
)
449 self
.tbicon
.Bind(wx
.EVT_MENU
, self
.OnTaskBarActivate
, id=self
.TBMENU_RESTORE
)
450 self
.tbicon
.Bind(wx
.EVT_MENU
, self
.OnTaskBarClose
, id=self
.TBMENU_CLOSE
)
452 wx
.CallAfter(self
.ShowTip
)
455 self
.Bind(wx
.EVT_IDLE
, self
.OnIdle
)
456 self
.Bind(wx
.EVT_CLOSE
, self
.OnCloseWindow
)
457 self
.Bind(wx
.EVT_ICONIZE
, self
.OnIconfiy
)
458 self
.Bind(wx
.EVT_MAXIMIZE
, self
.OnMaximize
)
461 self
.CreateStatusBar(1, wx
.ST_SIZEGRIP
)
463 splitter
= wx
.SplitterWindow(self
, -1)
464 splitter2
= wx
.SplitterWindow(splitter
, -1)
466 def EmptyHandler(evt
): pass
467 #splitter.Bind(wx.EVT_ERASE_BACKGROUND, EmptyHandler)
468 #splitter2.Bind(wx.EVT_ERASE_BACKGROUND, EmptyHandler)
470 # Prevent TreeCtrl from displaying all items after destruction when True
474 self
.mainmenu
= wx
.MenuBar()
477 menu
.Append(exitID
, 'E&xit\tAlt-X', 'Get the heck outta here!')
478 self
.Bind(wx
.EVT_MENU
, self
.OnFileExit
, id=exitID
)
479 wx
.App_SetMacExitMenuItemId(exitID
)
480 self
.mainmenu
.Append(menu
, '&File')
484 for item
in _treeList
:
486 for childItem
in item
[1]:
488 submenu
.Append(mID
, childItem
)
489 self
.Bind(wx
.EVT_MENU
, self
.OnDemoMenu
, id=mID
)
490 menu
.AppendMenu(wx
.NewId(), item
[0], submenu
)
491 self
.mainmenu
.Append(menu
, '&Demo')
497 findnextID
= wx
.NewId()
499 menu
.Append(findID
, '&Find\tCtrl-F', 'Find in the Demo Code')
500 menu
.Append(findnextID
, 'Find &Next\tF3', 'Find Next')
501 menu
.AppendSeparator()
502 menu
.Append(helpID
, '&About\tCtrl-H', 'wxPython RULES!!!')
503 wx
.App_SetMacAboutMenuItemId(helpID
)
504 self
.Bind(wx
.EVT_MENU
, self
.OnHelpAbout
, id=helpID
)
505 self
.Bind(wx
.EVT_MENU
, self
.OnHelpFind
, id=findID
)
506 self
.Bind(wx
.EVT_MENU
, self
.OnFindNext
, id=findnextID
)
507 self
.Bind(wx
.EVT_COMMAND_FIND
, self
.OnFind
)
508 self
.Bind(wx
.EVT_COMMAND_FIND_NEXT
, self
.OnFind
)
509 self
.Bind(wx
.EVT_COMMAND_FIND_CLOSE
, self
.OnFindClose
)
510 self
.mainmenu
.Append(menu
, '&Help')
511 self
.SetMenuBar(self
.mainmenu
)
513 self
.finddata
= wx
.FindReplaceData()
516 # This is another way to set Accelerators, in addition to
517 # using the '\t<key>' syntax in the menu items.
518 aTable
= wx
.AcceleratorTable([(wx
.ACCEL_ALT
, ord('X'), exitID
),
519 (wx
.ACCEL_CTRL
, ord('H'), helpID
),
520 (wx
.ACCEL_CTRL
, ord('F'), findID
),
521 (wx
.ACCEL_NORMAL
, WXK_F3
, findnextID
)
523 self
.SetAcceleratorTable(aTable
)
529 self
.tree
= wx
.TreeCtrl(splitter
, tID
, style
=
530 wx
.TR_DEFAULT_STYLE
#| wx.TR_HAS_VARIABLE_ROW_HEIGHT
533 root
= self
.tree
.AddRoot("wxPython Overview")
535 for item
in _treeList
:
536 child
= self
.tree
.AppendItem(root
, item
[0])
537 if not firstChild
: firstChild
= child
538 for childItem
in item
[1]:
539 theDemo
= self
.tree
.AppendItem(child
, childItem
)
540 self
.treeMap
[childItem
] = theDemo
542 self
.tree
.Expand(root
)
543 self
.tree
.Expand(firstChild
)
544 self
.tree
.Bind(wx
.EVT_TREE_ITEM_EXPANDED
, self
.OnItemExpanded
, id=tID
)
545 self
.tree
.Bind(wx
.EVT_TREE_ITEM_COLLAPSED
, self
.OnItemCollapsed
, id=tID
)
546 self
.tree
.Bind(wx
.EVT_TREE_SEL_CHANGED
, self
.OnSelChanged
, id=tID
)
547 self
.tree
.Bind(wx
.EVT_LEFT_DOWN
, self
.OnTreeLeftDown
)
550 self
.nb
= wx
.Notebook(splitter2
, -1, style
=wx
.CLIP_CHILDREN
)
552 # Set up a wx.html.HtmlWindow on the Overview Notebook page
553 # we put it in a panel first because there seems to be a
554 # refresh bug of some sort (wxGTK) when it is directly in
557 self
.ovr
= wx
.html
.HtmlWindow(self
.nb
, -1, size
=(400, 400))
558 self
.nb
.AddPage(self
.ovr
, self
.overviewText
)
560 else: # hopefully I can remove this hacky code soon, see SF bug #216861
561 panel
= wx
.Panel(self
.nb
, -1, style
=wx
.CLIP_CHILDREN
)
562 self
.ovr
= wx
.html
.HtmlWindow(panel
, -1, size
=(400, 400))
563 self
.nb
.AddPage(panel
, self
.overviewText
)
565 def OnOvrSize(evt
, ovr
=self
.ovr
):
566 ovr
.SetSize(evt
.GetSize())
568 panel
.Bind(wx
.EVT_SIZE
, OnOvrSize
)
569 panel
.Bind(wx
.EVT_ERASE_BACKGROUND
, EmptyHandler
)
572 self
.SetOverview(self
.overviewText
, overview
)
575 # Set up a notebook page for viewing the source code of each sample
576 self
.txt
= DemoCodeViewer(self
.nb
, -1)
577 self
.nb
.AddPage(self
.txt
, "Demo Code")
578 self
.LoadDemoSource('Main.py')
581 # Set up a log on the View Log Notebook page
582 self
.log
= wx
.TextCtrl(splitter2
, -1,
583 style
= wx
.TE_MULTILINE|wx
.TE_READONLY|wx
.HSCROLL
)
585 # Set the wxWindows log target to be this textctrl
586 #wx.Log_SetActiveTarget(wx.LogTextCtrl(self.log))
588 # But instead of the above we want to show how to use our own wx.Log class
589 wx
.Log_SetActiveTarget(MyLog(self
.log
))
591 # for serious debugging
592 #wx.Log_SetActiveTarget(wx.LogStderr())
593 #wx.Log_SetTraceMask(wx.TraceMessages)
596 # add the windows to the splitter and split it.
597 splitter2
.SplitHorizontally(self
.nb
, self
.log
, -120)
598 splitter
.SplitVertically(self
.tree
, splitter2
, 180)
600 splitter
.SetMinimumPaneSize(20)
601 splitter2
.SetMinimumPaneSize(20)
604 # Make the splitter on the right expand the top wind when resized
605 def SplitterOnSize(evt
):
606 splitter
= evt
.GetEventObject()
607 sz
= splitter
.GetSize()
608 splitter
.SetSashPosition(sz
.height
- 120, False)
611 splitter2
.Bind(wx
.EVT_SIZE
, SplitterOnSize
)
614 # select initial items
615 self
.nb
.SetSelection(0)
616 self
.tree
.SelectItem(root
)
618 if len(sys
.argv
) == 2:
620 selectedDemo
= self
.treeMap
[sys
.argv
[1]]
624 self
.tree
.SelectItem(selectedDemo
)
625 self
.tree
.EnsureVisible(selectedDemo
)
628 wx
.LogMessage('window handle: %s' % self
.GetHandle())
631 #---------------------------------------------
632 def WriteText(self
, text
):
633 if text
[-1:] == '\n':
638 def write(self
, txt
):
641 #---------------------------------------------
642 def OnItemExpanded(self
, event
):
643 item
= event
.GetItem()
644 wx
.LogMessage("OnItemExpanded: %s" % self
.tree
.GetItemText(item
))
647 #---------------------------------------------
648 def OnItemCollapsed(self
, event
):
649 item
= event
.GetItem()
650 wx
.LogMessage("OnItemCollapsed: %s" % self
.tree
.GetItemText(item
))
653 #---------------------------------------------
654 def OnTreeLeftDown(self
, event
):
655 pt
= event
.GetPosition();
656 item
, flags
= self
.tree
.HitTest(pt
)
657 if item
== self
.tree
.GetSelection():
658 self
.SetOverview(self
.tree
.GetItemText(item
)+" Overview", self
.curOverview
)
661 #---------------------------------------------
662 def OnSelChanged(self
, event
):
666 item
= event
.GetItem()
667 itemText
= self
.tree
.GetItemText(item
)
668 self
.RunDemo(itemText
)
671 #---------------------------------------------
672 def RunDemo(self
, itemText
):
674 if self
.nb
.GetPageCount() == 3:
675 if self
.nb
.GetSelection() == 2:
676 self
.nb
.SetSelection(0)
677 # inform the window that it's time to quit if it cares
678 if self
.window
is not None:
679 if hasattr(self
.window
, "ShutdownDemo"):
680 self
.window
.ShutdownDemo()
681 wx
.SafeYield() # in case the page has pending events
682 self
.nb
.DeletePage(2)
684 if itemText
== self
.overviewText
:
685 self
.LoadDemoSource('Main.py')
686 self
.SetOverview(self
.overviewText
, overview
)
691 if os
.path
.exists(itemText
+ '.py'):
693 wx
.LogMessage("Running demo %s.py..." % itemText
)
695 self
.LoadDemoSource(itemText
+ '.py')
697 if (sys
.modules
.has_key(itemText
)):
698 reload(sys
.modules
[itemText
])
700 module
= __import__(itemText
, globals())
701 self
.SetOverview(itemText
+ " Overview", module
.overview
)
706 # in case runTest is modal, make sure things look right...
710 self
.window
= module
.runTest(self
, self
.nb
, self
) ###
711 if self
.window
is not None:
712 self
.nb
.AddPage(self
.window
, 'Demo')
713 self
.nb
.SetSelection(2)
714 self
.nb
.Refresh() # without this wxMac has troubles showing the just added page
723 #---------------------------------------------
725 def LoadDemoSource(self
, filename
):
728 self
.txt
.SetValue(open(filename
).read())
730 self
.txt
.SetValue("Cannot open %s file." % filename
)
732 self
.txt
.SetInsertionPoint(0)
733 self
.txt
.ShowPosition(0)
735 #---------------------------------------------
736 def SetOverview(self
, name
, text
):
737 self
.curOverview
= text
739 if lead
!= '<html>' and lead
!= '<HTML>':
740 text
= '<br>'.join(text
.split('\n'))
741 self
.ovr
.SetPage(text
)
742 self
.nb
.SetPageText(0, name
)
744 #---------------------------------------------
746 def OnFileExit(self
, *event
):
749 def OnHelpAbout(self
, event
):
750 from About
import MyAboutBox
751 about
= MyAboutBox(self
)
755 def OnHelpFind(self
, event
):
756 self
.nb
.SetSelection(1)
757 self
.finddlg
= wx
.FindReplaceDialog(self
, self
.finddata
, "Find",
761 self
.finddlg
.Show(True)
763 def OnFind(self
, event
):
764 self
.nb
.SetSelection(1)
765 end
= self
.txt
.GetLastPosition()
766 textstring
= self
.txt
.GetRange(0, end
).lower()
767 start
= self
.txt
.GetSelection()[1]
768 findstring
= self
.finddata
.GetFindString().lower()
769 loc
= textstring
.find(findstring
, start
)
770 if loc
== -1 and start
!= 0:
771 # string not found, start at beginning
773 loc
= textstring
.find(findstring
, start
)
775 dlg
= wx
.MessageDialog(self
, 'Find String Not Found',
776 'Find String Not Found in Demo File',
777 wx
.OK | wx
.ICON_INFORMATION
)
782 self
.finddlg
.SetFocus()
785 self
.finddlg
.Destroy()
786 self
.txt
.ShowPosition(loc
)
787 self
.txt
.SetSelection(loc
, loc
+ len(findstring
))
791 def OnFindNext(self
, event
):
792 if self
.finddata
.GetFindString():
795 self
.OnHelpFind(event
)
797 def OnFindClose(self
, event
):
798 event
.GetDialog().Destroy()
801 #---------------------------------------------
802 def OnCloseWindow(self
, event
):
806 if hasattr(self
, "tbicon"):
811 #---------------------------------------------
812 def OnIdle(self
, event
):
814 self
.otherWin
.Raise()
815 self
.window
= self
.otherWin
819 #---------------------------------------------
822 showTipText
= open(opj("data/showTips")).read()
823 showTip
, index
= eval(showTipText
)
825 showTip
, index
= (1, 0)
827 tp
= wx
.CreateFileTipProvider(opj("data/tips.txt"), index
)
829 showTip
= wx
.ShowTip(self
, tp
)
830 index
= tp
.GetCurrentTip()
831 open(opj("data/showTips"), "w").write(str( (showTip
, index
) ))
834 #---------------------------------------------
835 def OnDemoMenu(self
, event
):
837 selectedDemo
= self
.treeMap
[self
.mainmenu
.GetLabel(event
.GetId())]
841 self
.tree
.SelectItem(selectedDemo
)
842 self
.tree
.EnsureVisible(selectedDemo
)
845 #---------------------------------------------
846 def OnTaskBarActivate(self
, evt
):
847 if self
.IsIconized():
849 if not self
.IsShown():
853 #---------------------------------------------
855 TBMENU_RESTORE
= 1000
858 def OnTaskBarMenu(self
, evt
):
860 menu
.Append(self
.TBMENU_RESTORE
, "Restore wxPython Demo")
861 menu
.Append(self
.TBMENU_CLOSE
, "Close")
862 self
.tbicon
.PopupMenu(menu
)
865 #---------------------------------------------
866 def OnTaskBarClose(self
, evt
):
869 # because of the way wx.TaskBarIcon.PopupMenu is implemented we have to
870 # prod the main idle handler a bit to get the window to actually close
871 wx
.GetApp().ProcessIdle()
874 #---------------------------------------------
875 def OnIconfiy(self
, evt
):
876 wx
.LogMessage("OnIconfiy")
879 #---------------------------------------------
880 def OnMaximize(self
, evt
):
881 wx
.LogMessage("OnMaximize")
887 #---------------------------------------------------------------------------
888 #---------------------------------------------------------------------------
890 class MySplashScreen(wx
.SplashScreen
):
892 bmp
= wx
.Image(opj("bitmaps/splash.gif")).ConvertToBitmap()
893 wx
.SplashScreen
.__init
__(self
, bmp
,
894 wx
.SPLASH_CENTRE_ON_SCREEN | wx
.SPLASH_TIMEOUT
,
896 self
.Bind(wx
.EVT_CLOSE
, self
.OnClose
)
898 def OnClose(self
, evt
):
899 frame
= wxPythonDemo(None, -1, "wxPython: (A Demonstration)")
901 evt
.Skip() # Make sure the default handler runs too...
907 Create and show the splash screen. It will then create and show
908 the main frame when it is time to do so.
911 wx
.InitAllImageHandlers()
913 # Normally when using a SplashScreen you would create it, show
914 # it and then continue on with the applicaiton's
915 # initialization, finally creating and showing the main
916 # application window(s). In this case we have nothing else to
917 # do so we'll delay showing the main frame until later (see
918 # OnClose above) so the users can see the SplashScrren effect.
919 splash
= MySplashScreen()
926 #---------------------------------------------------------------------------
930 demoPath
= os
.path
.dirname(__file__
)
934 app
= MyApp(0) #wx.Platform == "__WXMAC__")
938 #---------------------------------------------------------------------------
942 overview
= """<html><body>
945 <p> wxPython is a <b>GUI toolkit</b> for the <a
946 href="http://www.python.org/">Python</a> programming language. It
947 allows Python programmers to create programs with a robust, highly
948 functional graphical user interface, simply and easily. It is
949 implemented as a Python extension module (native code) that wraps the
950 popular <a href="http://wxwindows.org/front.htm">wxWindows</a> cross
951 platform GUI library, which is written in C++.
953 <p> Like Python and wxWindows, wxPython is <b>Open Source</b> which
954 means that it is free for anyone to use and the source code is
955 available for anyone to look at and modify. Or anyone can contribute
956 fixes or enhancements to the project.
958 <p> wxPython is a <b>cross-platform</b> toolkit. This means that the
959 same program will run on multiple platforms without modification.
960 Currently supported platforms are 32-bit Microsoft Windows, most Unix
961 or unix-like systems, and Macintosh OS X. Since the language is
962 Python, wxPython programs are <b>simple, easy</b> to write and easy to
965 <p> <b>This demo</b> is not only a collection of test cases for
966 wxPython, but is also designed to help you learn about and how to use
967 wxPython. Each sample is listed in the tree control on the left.
968 When a sample is selected in the tree then a module is loaded and run
969 (usually in a tab of this notebook,) and the source code of the module
970 is loaded in another tab for you to browse and learn from.
975 #----------------------------------------------------------------------------
976 #----------------------------------------------------------------------------
978 if __name__
== '__main__':
981 #----------------------------------------------------------------------------