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 "wx.VERSION_STRING = ", wx.VERSION_STRING
25 ##raw_input("Press Enter...")
28 #---------------------------------------------------------------------------
33 ('Recent Additions', [
38 'XmlResourceSubclass',
43 'ActiveX_FlashWindow',
44 'ActiveX_IEHtmlWindow',
48 # managed windows == things with a (optional) caption you can close
49 ('Base Frames and Dialogs', [
73 # 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.
148 'MaskedEditControls',
164 # How to lay out the controls in a frame/dialog
174 'XmlResourceHandler',
175 'XmlResourceSubclass',
179 ('Process and Events', [
190 ('Clipboard and DnD', [
223 # need libs not coming with the demo
224 ('Samples using an external library', [
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, style
=wx
.CLIP_CHILDREN | wx
.SP_LIVE_UPDATE | wx
.SP_3D
)
469 splitter2
= wx
.SplitterWindow(splitter
, -1, style
=wx
.CLIP_CHILDREN | wx
.SP_LIVE_UPDATE | wx
.SP_3D
)
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
):
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 # Normally when using a SplashScreen you would create it, show
925 # it and then continue on with the applicaiton's
926 # initialization, finally creating and showing the main
927 # application window(s). In this case we have nothing else to
928 # do so we'll delay showing the main frame until later (see
929 # OnClose above) so the users can see the SplashScreen effect.
930 splash
= MySplashScreen()
937 #---------------------------------------------------------------------------
941 demoPath
= os
.path
.dirname(__file__
)
945 app
= MyApp(0) ##wx.Platform == "__WXMAC__")
949 #---------------------------------------------------------------------------
953 overview
= """<html><body>
956 <p> wxPython is a <b>GUI toolkit</b> for the <a
957 href="http://www.python.org/">Python</a> programming language. It
958 allows Python programmers to create programs with a robust, highly
959 functional graphical user interface, simply and easily. It is
960 implemented as a Python extension module (native code) that wraps the
961 popular <a href="http://wxwindows.org/front.htm">wxWindows</a> cross
962 platform GUI library, which is written in C++.
964 <p> Like Python and wxWindows, wxPython is <b>Open Source</b> which
965 means that it is free for anyone to use and the source code is
966 available for anyone to look at and modify. Or anyone can contribute
967 fixes or enhancements to the project.
969 <p> wxPython is a <b>cross-platform</b> toolkit. This means that the
970 same program will run on multiple platforms without modification.
971 Currently supported platforms are 32-bit Microsoft Windows, most Unix
972 or unix-like systems, and Macintosh OS X. Since the language is
973 Python, wxPython programs are <b>simple, easy</b> to write and easy to
976 <p> <b>This demo</b> is not only a collection of test cases for
977 wxPython, but is also designed to help you learn about and how to use
978 wxPython. Each sample is listed in the tree control on the left.
979 When a sample is selected in the tree then a module is loaded and run
980 (usually in a tab of this notebook,) and the source code of the module
981 is loaded in another tab for you to browse and learn from.
986 #----------------------------------------------------------------------------
987 #----------------------------------------------------------------------------
989 if __name__
== '__main__':
992 #----------------------------------------------------------------------------