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     ('Objects 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
) 
 469         splitter2 
= wx
.SplitterWindow(splitter
, -1, style
=wx
.CLIP_CHILDREN
) 
 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         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 #----------------------------------------------------------------------------