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',
42 'ActiveX_FlashWindow',
43 'ActiveX_IEHtmlWindow',
47 # managed windows == things with a (optional) caption you can close
48 ('Base Frames and Dialogs', [
72 # dialogs from libraries
76 'MultipleChoiceDialog',
77 'ScrolledMessageDialog',
81 ('Core Windows/Controls', [
117 ('Custom Controls', [
130 # controls coming from other libraries
131 ('More Windows/Controls', [
132 'ActiveX_FlashWindow',
133 'ActiveX_IEHtmlWindow',
135 #'RightTextCtrl', deprecated as we have wxTE_RIGHT now.
149 'MaskedEditControls',
165 # How to lay out the controls in a frame/dialog
175 'XmlResourceHandler',
176 'XmlResourceSubclass',
180 ('Process and Events', [
192 ('Clipboard and DnD', [
226 # need libs not coming with the demo
227 ('Objects using an external library', [
228 ##'ActiveXWrapper_Acrobat',
229 ##'ActiveXWrapper_IE', # currently has tstate problems...
231 #'PlotCanvas', # deprecated, use PyPlot
235 ('Check out the samples dir too', [
242 #---------------------------------------------------------------------------
243 # Show how to derive a custom wxLog class
245 class MyLog(wx
.PyLog
):
246 def __init__(self
, textCtrl
, logTime
=0):
247 wx
.PyLog
.__init
__(self
)
249 self
.logTime
= logTime
251 def DoLogString(self
, message
, timeStamp
):
253 message
= time
.strftime("%X", time
.localtime(timeStamp
)) + \
256 self
.tc
.AppendText(message
+ '\n')
259 class MyTP(wx
.PyTipProvider
):
261 return "This is my tip"
263 #---------------------------------------------------------------------------
264 # A class to be used to display source code in the demo. Try using the
265 # wxSTC in the StyledTextCtrl_2 sample first, fall back to wxTextCtrl
266 # if there is an error, such as the stc module not being present.
272 from StyledTextCtrl_2
import PythonSTC
273 class DemoCodeViewer(PythonSTC
):
274 def __init__(self
, parent
, ID
):
275 PythonSTC
.__init
__(self
, parent
, ID
, wx
.BORDER_NONE
)
278 # Some methods to make it compatible with how the wxTextCtrl is used
279 def SetValue(self
, value
):
280 self
.SetReadOnly(False)
282 self
.SetReadOnly(True)
287 def SetInsertionPoint(self
, pos
):
288 self
.SetCurrentPos(pos
)
290 def ShowPosition(self
, pos
):
293 def GetLastPosition(self
):
294 return self
.GetLength()
296 def GetRange(self
, start
, end
):
297 return self
.GetTextRange(start
, end
)
299 def GetSelection(self
):
300 return self
.GetAnchor(), self
.GetCurrentPos()
302 def SetSelection(self
, start
, end
):
303 self
.SetSelectionStart(start
)
304 self
.SetSelectionEnd(end
)
306 def SetUpEditor(self
):
308 This method carries out the work of setting up the demo editor.
309 It's seperate so as not to clutter up the init code.
313 self
.SetLexer(stc
.STC_LEX_PYTHON
)
314 self
.SetKeyWords(0, " ".join(keyword
.kwlist
))
317 self
.SetProperty("fold", "1" )
319 # Highlight tab/space mixing (shouldn't be any)
320 self
.SetProperty("tab.timmy.whinge.level", "1")
322 # Set left and right margins
325 # Set up the numbers in the margin for margin #1
326 self
.SetMarginType(1, wx
.stc
.STC_MARGIN_NUMBER
)
327 # Reasonable value for, say, 4-5 digits using a mono font (40 pix)
328 self
.SetMarginWidth(1, 40)
330 # Indentation and tab stuff
331 self
.SetIndent(4) # Proscribed indent size for wx
332 self
.SetIndentationGuides(True) # Show indent guides
333 self
.SetBackSpaceUnIndents(True)# Backspace unindents rather than delete 1 space
334 self
.SetTabIndents(True) # Tab key indents
335 self
.SetTabWidth(4) # Proscribed tab size for wx
336 self
.SetUseTabs(False) # Use spaces rather than tabs, or
337 # TabTimmy will complain!
339 self
.SetViewWhiteSpace(False) # Don't view white space
342 #self.SetEOLMode(wx.stc.STC_EOL_CRLF) # Just leave it at the default (autosense)
343 self
.SetViewEOL(False)
344 # No right-edge mode indicator
345 self
.SetEdgeMode(stc
.STC_EDGE_NONE
)
347 # Setup a margin to hold fold markers
348 self
.SetMarginType(2, stc
.STC_MARGIN_SYMBOL
)
349 self
.SetMarginMask(2, stc
.STC_MASK_FOLDERS
)
350 self
.SetMarginSensitive(2, True)
351 self
.SetMarginWidth(2, 12)
353 # and now set up the fold markers
354 self
.MarkerDefine(stc
.STC_MARKNUM_FOLDEREND
, stc
.STC_MARK_BOXPLUSCONNECTED
, "white", "black")
355 self
.MarkerDefine(stc
.STC_MARKNUM_FOLDEROPENMID
, stc
.STC_MARK_BOXMINUSCONNECTED
, "white", "black")
356 self
.MarkerDefine(stc
.STC_MARKNUM_FOLDERMIDTAIL
, stc
.STC_MARK_TCORNER
, "white", "black")
357 self
.MarkerDefine(stc
.STC_MARKNUM_FOLDERTAIL
, stc
.STC_MARK_LCORNER
, "white", "black")
358 self
.MarkerDefine(stc
.STC_MARKNUM_FOLDERSUB
, stc
.STC_MARK_VLINE
, "white", "black")
359 self
.MarkerDefine(stc
.STC_MARKNUM_FOLDER
, stc
.STC_MARK_BOXPLUS
, "white", "black")
360 self
.MarkerDefine(stc
.STC_MARKNUM_FOLDEROPEN
, stc
.STC_MARK_BOXMINUS
, "white", "black")
362 # Global default style
363 if wx
.Platform
== '__WXMSW__':
364 self
.StyleSetSpec(stc
.STC_STYLE_DEFAULT
,
365 'fore:#000000,back:#FFFFFF,face:Courier New,size:9')
367 self
.StyleSetSpec(stc
.STC_STYLE_DEFAULT
,
368 'fore:#000000,back:#FFFFFF,face:Courier,size:12')
370 # Clear styles and revert to default.
373 # Following style specs only indicate differences from default.
374 # The rest remains unchanged.
376 # Line numbers in margin
377 self
.StyleSetSpec(wx
.stc
.STC_STYLE_LINENUMBER
,'fore:#000000,back:#99A9C2')
380 self
.StyleSetSpec(wx
.stc
.STC_STYLE_BRACELIGHT
,'fore:#00009D,back:#FFFF00')
382 self
.StyleSetSpec(wx
.stc
.STC_STYLE_BRACEBAD
,'fore:#00009D,back:#FF0000')
384 self
.StyleSetSpec(wx
.stc
.STC_STYLE_INDENTGUIDE
, "fore:#CDCDCD")
387 self
.StyleSetSpec(wx
.stc
.STC_P_DEFAULT
, 'fore:#000000')
389 self
.StyleSetSpec(wx
.stc
.STC_P_COMMENTLINE
, 'fore:#008000,back:#F0FFF0')
390 self
.StyleSetSpec(wx
.stc
.STC_P_COMMENTBLOCK
, 'fore:#008000,back:#F0FFF0')
392 self
.StyleSetSpec(wx
.stc
.STC_P_NUMBER
, 'fore:#008080')
393 # Strings and characters
394 self
.StyleSetSpec(wx
.stc
.STC_P_STRING
, 'fore:#800080')
395 self
.StyleSetSpec(wx
.stc
.STC_P_CHARACTER
, 'fore:#800080')
397 self
.StyleSetSpec(wx
.stc
.STC_P_WORD
, 'fore:#000080,bold')
399 self
.StyleSetSpec(wx
.stc
.STC_P_TRIPLE
, 'fore:#800080,back:#FFFFEA')
400 self
.StyleSetSpec(wx
.stc
.STC_P_TRIPLEDOUBLE
, 'fore:#800080,back:#FFFFEA')
402 self
.StyleSetSpec(wx
.stc
.STC_P_CLASSNAME
, 'fore:#0000FF,bold')
404 self
.StyleSetSpec(wx
.stc
.STC_P_DEFNAME
, 'fore:#008080,bold')
406 self
.StyleSetSpec(wx
.stc
.STC_P_OPERATOR
, 'fore:#800000,bold')
407 # Identifiers. I leave this as not bold because everything seems
408 # to be an identifier if it doesn't match the above criterae
409 self
.StyleSetSpec(wx
.stc
.STC_P_IDENTIFIER
, 'fore:#000000')
412 self
.SetCaretForeground("BLUE")
413 # Selection background
414 self
.SetSelBackground(1, '#66CCFF')
416 self
.SetSelBackground(True, wx
.SystemSettings_GetColour(wx
.SYS_COLOUR_HIGHLIGHT
))
417 self
.SetSelForeground(True, wx
.SystemSettings_GetColour(wx
.SYS_COLOUR_HIGHLIGHTTEXT
))
421 class DemoCodeViewer(wx
.TextCtrl
):
422 def __init__(self
, parent
, ID
):
423 wx
.TextCtrl
.__init
__(self
, parent
, ID
, style
=
424 wx
.TE_MULTILINE | wx
.TE_READONLY |
425 wx
.HSCROLL | wx
.TE_RICH2 | wx
.TE_NOHIDESEL
)
428 #---------------------------------------------------------------------------
431 """Convert paths to the platform-specific separator"""
432 return apply(os
.path
.join
, tuple(path
.split('/')))
435 #---------------------------------------------------------------------------
437 class wxPythonDemo(wx
.Frame
):
438 overviewText
= "wxPython Overview"
440 def __init__(self
, parent
, id, title
):
441 wx
.Frame
.__init
__(self
, parent
, -1, title
, size
= (800, 600),
442 style
=wx
.DEFAULT_FRAME_STYLE|wx
.NO_FULL_REPAINT_ON_RESIZE
)
445 self
.cwd
= os
.getcwd()
446 self
.curOverview
= ""
449 icon
= images
.getMondrianIcon()
452 if wx
.Platform
!= '__WXMAC__':
453 # setup a taskbar icon, and catch some events from it
454 icon
= wx
.IconFromBitmap(
455 images
.getMondrianImage().Scale(16,16).ConvertToBitmap() )
456 self
.tbicon
= wx
.TaskBarIcon()
457 self
.tbicon
.SetIcon(icon
, "wxPython Demo")
458 self
.tbicon
.Bind(wx
.EVT_TASKBAR_LEFT_DCLICK
, self
.OnTaskBarActivate
)
459 self
.tbicon
.Bind(wx
.EVT_TASKBAR_RIGHT_UP
, self
.OnTaskBarMenu
)
460 self
.tbicon
.Bind(wx
.EVT_MENU
, self
.OnTaskBarActivate
, id=self
.TBMENU_RESTORE
)
461 self
.tbicon
.Bind(wx
.EVT_MENU
, self
.OnTaskBarClose
, id=self
.TBMENU_CLOSE
)
463 wx
.CallAfter(self
.ShowTip
)
466 self
.Bind(wx
.EVT_IDLE
, self
.OnIdle
)
467 self
.Bind(wx
.EVT_CLOSE
, self
.OnCloseWindow
)
468 self
.Bind(wx
.EVT_ICONIZE
, self
.OnIconfiy
)
469 self
.Bind(wx
.EVT_MAXIMIZE
, self
.OnMaximize
)
472 self
.CreateStatusBar(1, wx
.ST_SIZEGRIP
)
474 splitter
= wx
.SplitterWindow(self
, -1)
475 splitter2
= wx
.SplitterWindow(splitter
, -1) ##, size=(20,20))
477 # Set up a log on the View Log Notebook page
478 self
.log
= wx
.TextCtrl(splitter2
, -1,
479 style
= wx
.TE_MULTILINE|wx
.TE_READONLY|wx
.HSCROLL
)
481 # Set the wxWindows log target to be this textctrl
482 #wx.Log_SetActiveTarget(wx.LogTextCtrl(self.log))
484 # But instead of the above we want to show how to use our own wx.Log class
485 wx
.Log_SetActiveTarget(MyLog(self
.log
))
487 # for serious debugging
488 #wx.Log_SetActiveTarget(wx.LogStderr())
489 #wx.Log_SetTraceMask(wx.TraceMessages)
493 def EmptyHandler(evt
): pass
494 #splitter.Bind(wx.EVT_ERASE_BACKGROUND, EmptyHandler)
495 #splitter2.Bind(wx.EVT_ERASE_BACKGROUND, EmptyHandler)
497 # Prevent TreeCtrl from displaying all items after destruction when True
501 self
.mainmenu
= wx
.MenuBar()
503 item
= menu
.Append(-1, '&Redirect Output',
504 'Redirect print statements to a window',
506 self
.Bind(wx
.EVT_MENU
, self
.OnToggleRedirect
, item
)
508 item
= menu
.Append(-1, 'E&xit\tAlt-X', 'Get the heck outta here!')
509 self
.Bind(wx
.EVT_MENU
, self
.OnFileExit
, item
)
510 wx
.App_SetMacExitMenuItemId(item
.GetId())
512 self
.mainmenu
.Append(menu
, '&File')
516 for item
in _treeList
:
518 for childItem
in item
[1]:
519 mi
= submenu
.Append(-1, childItem
)
520 self
.Bind(wx
.EVT_MENU
, self
.OnDemoMenu
, mi
)
521 menu
.AppendMenu(wx
.NewId(), item
[0], submenu
)
522 self
.mainmenu
.Append(menu
, '&Demo')
528 findnextID
= wx
.NewId()
530 findItem
= menu
.Append(-1, '&Find\tCtrl-F', 'Find in the Demo Code')
531 findnextItem
= menu
.Append(-1, 'Find &Next\tF3', 'Find Next')
532 menu
.AppendSeparator()
533 helpItem
= menu
.Append(-1, '&About\tCtrl-H', 'wxPython RULES!!!')
534 wx
.App_SetMacAboutMenuItemId(helpItem
.GetId())
535 self
.Bind(wx
.EVT_MENU
, self
.OnHelpAbout
, helpItem
)
536 self
.Bind(wx
.EVT_MENU
, self
.OnHelpFind
, findItem
)
537 self
.Bind(wx
.EVT_MENU
, self
.OnFindNext
, findnextItem
)
538 self
.Bind(wx
.EVT_COMMAND_FIND
, self
.OnFind
)
539 self
.Bind(wx
.EVT_COMMAND_FIND_NEXT
, self
.OnFind
)
540 self
.Bind(wx
.EVT_COMMAND_FIND_CLOSE
, self
.OnFindClose
)
541 self
.mainmenu
.Append(menu
, '&Help')
542 self
.SetMenuBar(self
.mainmenu
)
544 self
.finddata
= wx
.FindReplaceData()
547 # This is another way to set Accelerators, in addition to
548 # using the '\t<key>' syntax in the menu items.
549 aTable
= wx
.AcceleratorTable([(wx
.ACCEL_ALT
, ord('X'), exitID
),
550 (wx
.ACCEL_CTRL
, ord('H'), helpID
),
551 (wx
.ACCEL_CTRL
, ord('F'), findID
),
552 (wx
.ACCEL_NORMAL
, WXK_F3
, findnextID
)
554 self
.SetAcceleratorTable(aTable
)
560 self
.tree
= wx
.TreeCtrl(splitter
, tID
, style
=
561 wx
.TR_DEFAULT_STYLE
#| wx.TR_HAS_VARIABLE_ROW_HEIGHT
564 root
= self
.tree
.AddRoot("wxPython Overview")
566 for item
in _treeList
:
567 child
= self
.tree
.AppendItem(root
, item
[0])
568 if not firstChild
: firstChild
= child
569 for childItem
in item
[1]:
570 theDemo
= self
.tree
.AppendItem(child
, childItem
)
571 self
.treeMap
[childItem
] = theDemo
573 self
.tree
.Expand(root
)
574 self
.tree
.Expand(firstChild
)
575 self
.tree
.Bind(wx
.EVT_TREE_ITEM_EXPANDED
, self
.OnItemExpanded
, id=tID
)
576 self
.tree
.Bind(wx
.EVT_TREE_ITEM_COLLAPSED
, self
.OnItemCollapsed
, id=tID
)
577 self
.tree
.Bind(wx
.EVT_TREE_SEL_CHANGED
, self
.OnSelChanged
, id=tID
)
578 self
.tree
.Bind(wx
.EVT_LEFT_DOWN
, self
.OnTreeLeftDown
)
581 self
.nb
= wx
.Notebook(splitter2
, -1, style
=wx
.CLIP_CHILDREN
)
583 # Set up a wx.html.HtmlWindow on the Overview Notebook page
584 # we put it in a panel first because there seems to be a
585 # refresh bug of some sort (wxGTK) when it is directly in
588 self
.ovr
= wx
.html
.HtmlWindow(self
.nb
, -1, size
=(400, 400))
589 self
.nb
.AddPage(self
.ovr
, self
.overviewText
)
591 else: # hopefully I can remove this hacky code soon, see SF bug #216861
592 panel
= wx
.Panel(self
.nb
, -1, style
=wx
.CLIP_CHILDREN
)
593 self
.ovr
= wx
.html
.HtmlWindow(panel
, -1, size
=(400, 400))
594 self
.nb
.AddPage(panel
, self
.overviewText
)
596 def OnOvrSize(evt
, ovr
=self
.ovr
):
597 ovr
.SetSize(evt
.GetSize())
599 panel
.Bind(wx
.EVT_SIZE
, OnOvrSize
)
600 panel
.Bind(wx
.EVT_ERASE_BACKGROUND
, EmptyHandler
)
603 self
.SetOverview(self
.overviewText
, overview
)
606 # Set up a notebook page for viewing the source code of each sample
607 self
.txt
= DemoCodeViewer(self
.nb
, -1)
608 self
.nb
.AddPage(self
.txt
, "Demo Code")
609 self
.LoadDemoSource('Main.py')
612 # add the windows to the splitter and split it.
613 splitter2
.SplitHorizontally(self
.nb
, self
.log
, -120)
614 splitter
.SplitVertically(self
.tree
, splitter2
, 180)
616 splitter
.SetMinimumPaneSize(20)
617 splitter2
.SetMinimumPaneSize(20)
620 # Make the splitter on the right expand the top window when resized
621 def SplitterOnSize(evt
):
622 splitter
= evt
.GetEventObject()
623 sz
= splitter
.GetSize()
624 splitter
.SetSashPosition(sz
.height
- 120, False)
627 splitter2
.Bind(wx
.EVT_SIZE
, SplitterOnSize
)
630 # select initial items
631 self
.nb
.SetSelection(0)
632 self
.tree
.SelectItem(root
)
634 if len(sys
.argv
) == 2:
636 selectedDemo
= self
.treeMap
[sys
.argv
[1]]
640 self
.tree
.SelectItem(selectedDemo
)
641 self
.tree
.EnsureVisible(selectedDemo
)
644 wx
.LogMessage('window handle: %s' % self
.GetHandle())
647 #---------------------------------------------
648 def WriteText(self
, text
):
649 if text
[-1:] == '\n':
654 def write(self
, txt
):
657 #---------------------------------------------
658 def OnItemExpanded(self
, event
):
659 item
= event
.GetItem()
660 wx
.LogMessage("OnItemExpanded: %s" % self
.tree
.GetItemText(item
))
663 #---------------------------------------------
664 def OnItemCollapsed(self
, event
):
665 item
= event
.GetItem()
666 wx
.LogMessage("OnItemCollapsed: %s" % self
.tree
.GetItemText(item
))
669 #---------------------------------------------
670 def OnTreeLeftDown(self
, event
):
671 pt
= event
.GetPosition();
672 item
, flags
= self
.tree
.HitTest(pt
)
673 if item
== self
.tree
.GetSelection():
674 self
.SetOverview(self
.tree
.GetItemText(item
)+" Overview", self
.curOverview
)
677 #---------------------------------------------
678 def OnSelChanged(self
, event
):
682 item
= event
.GetItem()
683 itemText
= self
.tree
.GetItemText(item
)
684 self
.RunDemo(itemText
)
687 #---------------------------------------------
688 def RunDemo(self
, itemText
):
690 if self
.nb
.GetPageCount() == 3:
691 if self
.nb
.GetSelection() == 2:
692 self
.nb
.SetSelection(0)
693 # inform the window that it's time to quit if it cares
694 if self
.window
is not None:
695 if hasattr(self
.window
, "ShutdownDemo"):
696 self
.window
.ShutdownDemo()
697 wx
.SafeYield() # in case the page has pending events
698 self
.nb
.DeletePage(2)
700 if itemText
== self
.overviewText
:
701 self
.LoadDemoSource('Main.py')
702 self
.SetOverview(self
.overviewText
, overview
)
706 if os
.path
.exists(itemText
+ '.py'):
708 wx
.LogMessage("Running demo %s.py..." % itemText
)
710 self
.LoadDemoSource(itemText
+ '.py')
712 if (sys
.modules
.has_key(itemText
)):
713 reload(sys
.modules
[itemText
])
715 module
= __import__(itemText
, globals())
716 self
.SetOverview(itemText
+ " Overview", module
.overview
)
721 self
.window
= module
.runTest(self
, self
.nb
, self
) ###
722 if self
.window
is not None:
723 self
.nb
.AddPage(self
.window
, 'Demo')
724 self
.nb
.SetSelection(2)
734 #---------------------------------------------
736 def LoadDemoSource(self
, filename
):
739 self
.txt
.SetValue(open(filename
).read())
741 self
.txt
.SetValue("Cannot open %s file." % filename
)
743 self
.txt
.SetInsertionPoint(0)
744 self
.txt
.ShowPosition(0)
746 #---------------------------------------------
747 def SetOverview(self
, name
, text
):
748 self
.curOverview
= text
750 if lead
!= '<html>' and lead
!= '<HTML>':
751 text
= '<br>'.join(text
.split('\n'))
752 self
.ovr
.SetPage(text
)
753 self
.nb
.SetPageText(0, name
)
755 #---------------------------------------------
757 def OnFileExit(self
, *event
):
760 def OnToggleRedirect(self
, event
):
764 print "Print statements and other standard output will now be directed to this window."
767 print "Print statements and other standard output will now be sent to the usual location."
769 def OnHelpAbout(self
, event
):
770 from About
import MyAboutBox
771 about
= MyAboutBox(self
)
775 def OnHelpFind(self
, event
):
776 self
.nb
.SetSelection(1)
777 self
.finddlg
= wx
.FindReplaceDialog(self
, self
.finddata
, "Find",
781 self
.finddlg
.Show(True)
783 def OnFind(self
, event
):
784 self
.nb
.SetSelection(1)
785 end
= self
.txt
.GetLastPosition()
786 textstring
= self
.txt
.GetRange(0, end
).lower()
787 start
= self
.txt
.GetSelection()[1]
788 findstring
= self
.finddata
.GetFindString().lower()
789 loc
= textstring
.find(findstring
, start
)
790 if loc
== -1 and start
!= 0:
791 # string not found, start at beginning
793 loc
= textstring
.find(findstring
, start
)
795 dlg
= wx
.MessageDialog(self
, 'Find String Not Found',
796 'Find String Not Found in Demo File',
797 wx
.OK | wx
.ICON_INFORMATION
)
802 self
.finddlg
.SetFocus()
805 self
.finddlg
.Destroy()
806 self
.txt
.ShowPosition(loc
)
807 self
.txt
.SetSelection(loc
, loc
+ len(findstring
))
811 def OnFindNext(self
, event
):
812 if self
.finddata
.GetFindString():
815 self
.OnHelpFind(event
)
817 def OnFindClose(self
, event
):
818 event
.GetDialog().Destroy()
821 #---------------------------------------------
822 def OnCloseWindow(self
, event
):
826 if hasattr(self
, "tbicon"):
831 #---------------------------------------------
832 def OnIdle(self
, event
):
834 self
.otherWin
.Raise()
835 self
.window
= self
.otherWin
839 #---------------------------------------------
842 showTipText
= open(opj("data/showTips")).read()
843 showTip
, index
= eval(showTipText
)
845 showTip
, index
= (1, 0)
847 tp
= wx
.CreateFileTipProvider(opj("data/tips.txt"), index
)
849 showTip
= wx
.ShowTip(self
, tp
)
850 index
= tp
.GetCurrentTip()
851 open(opj("data/showTips"), "w").write(str( (showTip
, index
) ))
854 #---------------------------------------------
855 def OnDemoMenu(self
, event
):
857 selectedDemo
= self
.treeMap
[self
.mainmenu
.GetLabel(event
.GetId())]
861 self
.tree
.SelectItem(selectedDemo
)
862 self
.tree
.EnsureVisible(selectedDemo
)
865 #---------------------------------------------
866 def OnTaskBarActivate(self
, evt
):
867 if self
.IsIconized():
869 if not self
.IsShown():
873 #---------------------------------------------
875 TBMENU_RESTORE
= 1000
878 def OnTaskBarMenu(self
, evt
):
880 menu
.Append(self
.TBMENU_RESTORE
, "Restore wxPython Demo")
881 menu
.Append(self
.TBMENU_CLOSE
, "Close")
882 self
.tbicon
.PopupMenu(menu
)
885 #---------------------------------------------
886 def OnTaskBarClose(self
, evt
):
889 # because of the way wx.TaskBarIcon.PopupMenu is implemented we have to
890 # prod the main idle handler a bit to get the window to actually close
891 wx
.GetApp().ProcessIdle()
894 #---------------------------------------------
895 def OnIconfiy(self
, evt
):
896 wx
.LogMessage("OnIconfiy")
899 #---------------------------------------------
900 def OnMaximize(self
, evt
):
901 wx
.LogMessage("OnMaximize")
907 #---------------------------------------------------------------------------
908 #---------------------------------------------------------------------------
910 class MySplashScreen(wx
.SplashScreen
):
912 bmp
= wx
.Image(opj("bitmaps/splash.gif")).ConvertToBitmap()
913 wx
.SplashScreen
.__init
__(self
, bmp
,
914 wx
.SPLASH_CENTRE_ON_SCREEN | wx
.SPLASH_TIMEOUT
,
916 self
.Bind(wx
.EVT_CLOSE
, self
.OnClose
)
918 def OnClose(self
, evt
):
920 frame
= wxPythonDemo(None, -1, "wxPython: (A Demonstration)")
922 evt
.Skip() # Make sure the default handler runs too...
928 Create and show the splash screen. It will then create and show
929 the main frame when it is time to do so.
932 wx
.InitAllImageHandlers()
934 # Normally when using a SplashScreen you would create it, show
935 # it and then continue on with the applicaiton's
936 # initialization, finally creating and showing the main
937 # application window(s). In this case we have nothing else to
938 # do so we'll delay showing the main frame until later (see
939 # OnClose above) so the users can see the SplashScrren effect.
940 splash
= MySplashScreen()
947 #---------------------------------------------------------------------------
951 demoPath
= os
.path
.dirname(__file__
)
955 app
= MyApp(0) ##wx.Platform == "__WXMAC__")
959 #---------------------------------------------------------------------------
963 overview
= """<html><body>
966 <p> wxPython is a <b>GUI toolkit</b> for the <a
967 href="http://www.python.org/">Python</a> programming language. It
968 allows Python programmers to create programs with a robust, highly
969 functional graphical user interface, simply and easily. It is
970 implemented as a Python extension module (native code) that wraps the
971 popular <a href="http://wxwindows.org/front.htm">wxWindows</a> cross
972 platform GUI library, which is written in C++.
974 <p> Like Python and wxWindows, wxPython is <b>Open Source</b> which
975 means that it is free for anyone to use and the source code is
976 available for anyone to look at and modify. Or anyone can contribute
977 fixes or enhancements to the project.
979 <p> wxPython is a <b>cross-platform</b> toolkit. This means that the
980 same program will run on multiple platforms without modification.
981 Currently supported platforms are 32-bit Microsoft Windows, most Unix
982 or unix-like systems, and Macintosh OS X. Since the language is
983 Python, wxPython programs are <b>simple, easy</b> to write and easy to
986 <p> <b>This demo</b> is not only a collection of test cases for
987 wxPython, but is also designed to help you learn about and how to use
988 wxPython. Each sample is listed in the tree control on the left.
989 When a sample is selected in the tree then a module is loaded and run
990 (usually in a tab of this notebook,) and the source code of the module
991 is loaded in another tab for you to browse and learn from.
996 #----------------------------------------------------------------------------
997 #----------------------------------------------------------------------------
999 if __name__
== '__main__':
1002 #----------------------------------------------------------------------------