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/Updates', [
38 # managed windows == things with a (optional) caption you can close
39 ('Base Frames and Dialogs', [
63 # dialogs from libraries
66 'MultipleChoiceDialog',
67 'ScrolledMessageDialog',
71 ('Core Windows/Controls', [
107 ('Custom Controls', [
120 # controls coming from other libraries
121 ('More Windows/Controls', [
122 'ActiveX_FlashWindow',
123 'ActiveX_IEHtmlWindow',
125 #'RightTextCtrl', deprecated as we have wxTE_RIGHT now.
138 'MaskedEditControls',
154 # How to lay out the controls in a frame/dialog
164 'XmlResourceHandler',
165 'XmlResourceSubclass',
169 ('Process and Events', [
180 ('Clipboard and DnD', [
213 # need libs not coming with the demo
214 ('Samples using an external library', [
219 ('Check out the samples dir too', [
226 #---------------------------------------------------------------------------
227 # Show how to derive a custom wxLog class
229 class MyLog(wx
.PyLog
):
230 def __init__(self
, textCtrl
, logTime
=0):
231 wx
.PyLog
.__init
__(self
)
233 self
.logTime
= logTime
235 def DoLogString(self
, message
, timeStamp
):
237 message
= time
.strftime("%X", time
.localtime(timeStamp
)) + \
240 self
.tc
.AppendText(message
+ '\n')
243 class MyTP(wx
.PyTipProvider
):
245 return "This is my tip"
247 #---------------------------------------------------------------------------
248 # A class to be used to display source code in the demo. Try using the
249 # wxSTC in the StyledTextCtrl_2 sample first, fall back to wxTextCtrl
250 # if there is an error, such as the stc module not being present.
254 ##raise ImportError # for testing the alternate implementation
256 from StyledTextCtrl_2
import PythonSTC
257 class DemoCodeViewer(PythonSTC
):
258 def __init__(self
, parent
, ID
):
259 PythonSTC
.__init
__(self
, parent
, ID
, wx
.BORDER_NONE
)
262 # Some methods to make it compatible with how the wxTextCtrl is used
263 def SetValue(self
, value
):
264 self
.SetReadOnly(False)
266 self
.SetReadOnly(True)
271 def SetInsertionPoint(self
, pos
):
272 self
.SetCurrentPos(pos
)
274 def ShowPosition(self
, pos
):
277 def GetLastPosition(self
):
278 return self
.GetLength()
280 def GetRange(self
, start
, end
):
281 return self
.GetTextRange(start
, end
)
283 def GetSelection(self
):
284 return self
.GetAnchor(), self
.GetCurrentPos()
286 def SetSelection(self
, start
, end
):
287 self
.SetSelectionStart(start
)
288 self
.SetSelectionEnd(end
)
290 def SetUpEditor(self
):
292 This method carries out the work of setting up the demo editor.
293 It's seperate so as not to clutter up the init code.
297 self
.SetLexer(stc
.STC_LEX_PYTHON
)
298 self
.SetKeyWords(0, " ".join(keyword
.kwlist
))
301 self
.SetProperty("fold", "1" )
303 # Highlight tab/space mixing (shouldn't be any)
304 self
.SetProperty("tab.timmy.whinge.level", "1")
306 # Set left and right margins
309 # Set up the numbers in the margin for margin #1
310 self
.SetMarginType(1, wx
.stc
.STC_MARGIN_NUMBER
)
311 # Reasonable value for, say, 4-5 digits using a mono font (40 pix)
312 self
.SetMarginWidth(1, 40)
314 # Indentation and tab stuff
315 self
.SetIndent(4) # Proscribed indent size for wx
316 self
.SetIndentationGuides(True) # Show indent guides
317 self
.SetBackSpaceUnIndents(True)# Backspace unindents rather than delete 1 space
318 self
.SetTabIndents(True) # Tab key indents
319 self
.SetTabWidth(4) # Proscribed tab size for wx
320 self
.SetUseTabs(False) # Use spaces rather than tabs, or
321 # TabTimmy will complain!
323 self
.SetViewWhiteSpace(False) # Don't view white space
326 #self.SetEOLMode(wx.stc.STC_EOL_CRLF) # Just leave it at the default (autosense)
327 self
.SetViewEOL(False)
328 # No right-edge mode indicator
329 self
.SetEdgeMode(stc
.STC_EDGE_NONE
)
331 # Setup a margin to hold fold markers
332 self
.SetMarginType(2, stc
.STC_MARGIN_SYMBOL
)
333 self
.SetMarginMask(2, stc
.STC_MASK_FOLDERS
)
334 self
.SetMarginSensitive(2, True)
335 self
.SetMarginWidth(2, 12)
337 # and now set up the fold markers
338 self
.MarkerDefine(stc
.STC_MARKNUM_FOLDEREND
, stc
.STC_MARK_BOXPLUSCONNECTED
, "white", "black")
339 self
.MarkerDefine(stc
.STC_MARKNUM_FOLDEROPENMID
, stc
.STC_MARK_BOXMINUSCONNECTED
, "white", "black")
340 self
.MarkerDefine(stc
.STC_MARKNUM_FOLDERMIDTAIL
, stc
.STC_MARK_TCORNER
, "white", "black")
341 self
.MarkerDefine(stc
.STC_MARKNUM_FOLDERTAIL
, stc
.STC_MARK_LCORNER
, "white", "black")
342 self
.MarkerDefine(stc
.STC_MARKNUM_FOLDERSUB
, stc
.STC_MARK_VLINE
, "white", "black")
343 self
.MarkerDefine(stc
.STC_MARKNUM_FOLDER
, stc
.STC_MARK_BOXPLUS
, "white", "black")
344 self
.MarkerDefine(stc
.STC_MARKNUM_FOLDEROPEN
, stc
.STC_MARK_BOXMINUS
, "white", "black")
346 # Global default style
347 if wx
.Platform
== '__WXMSW__':
348 self
.StyleSetSpec(stc
.STC_STYLE_DEFAULT
,
349 'fore:#000000,back:#FFFFFF,face:Courier New,size:9')
351 self
.StyleSetSpec(stc
.STC_STYLE_DEFAULT
,
352 'fore:#000000,back:#FFFFFF,face:Courier,size:12')
354 # Clear styles and revert to default.
357 # Following style specs only indicate differences from default.
358 # The rest remains unchanged.
360 # Line numbers in margin
361 self
.StyleSetSpec(wx
.stc
.STC_STYLE_LINENUMBER
,'fore:#000000,back:#99A9C2')
364 self
.StyleSetSpec(wx
.stc
.STC_STYLE_BRACELIGHT
,'fore:#00009D,back:#FFFF00')
366 self
.StyleSetSpec(wx
.stc
.STC_STYLE_BRACEBAD
,'fore:#00009D,back:#FF0000')
368 self
.StyleSetSpec(wx
.stc
.STC_STYLE_INDENTGUIDE
, "fore:#CDCDCD")
371 self
.StyleSetSpec(wx
.stc
.STC_P_DEFAULT
, 'fore:#000000')
373 self
.StyleSetSpec(wx
.stc
.STC_P_COMMENTLINE
, 'fore:#008000,back:#F0FFF0')
374 self
.StyleSetSpec(wx
.stc
.STC_P_COMMENTBLOCK
, 'fore:#008000,back:#F0FFF0')
376 self
.StyleSetSpec(wx
.stc
.STC_P_NUMBER
, 'fore:#008080')
377 # Strings and characters
378 self
.StyleSetSpec(wx
.stc
.STC_P_STRING
, 'fore:#800080')
379 self
.StyleSetSpec(wx
.stc
.STC_P_CHARACTER
, 'fore:#800080')
381 self
.StyleSetSpec(wx
.stc
.STC_P_WORD
, 'fore:#000080,bold')
383 self
.StyleSetSpec(wx
.stc
.STC_P_TRIPLE
, 'fore:#800080,back:#FFFFEA')
384 self
.StyleSetSpec(wx
.stc
.STC_P_TRIPLEDOUBLE
, 'fore:#800080,back:#FFFFEA')
386 self
.StyleSetSpec(wx
.stc
.STC_P_CLASSNAME
, 'fore:#0000FF,bold')
388 self
.StyleSetSpec(wx
.stc
.STC_P_DEFNAME
, 'fore:#008080,bold')
390 self
.StyleSetSpec(wx
.stc
.STC_P_OPERATOR
, 'fore:#800000,bold')
391 # Identifiers. I leave this as not bold because everything seems
392 # to be an identifier if it doesn't match the above criterae
393 self
.StyleSetSpec(wx
.stc
.STC_P_IDENTIFIER
, 'fore:#000000')
396 self
.SetCaretForeground("BLUE")
397 # Selection background
398 self
.SetSelBackground(1, '#66CCFF')
400 self
.SetSelBackground(True, wx
.SystemSettings_GetColour(wx
.SYS_COLOUR_HIGHLIGHT
))
401 self
.SetSelForeground(True, wx
.SystemSettings_GetColour(wx
.SYS_COLOUR_HIGHLIGHTTEXT
))
405 class DemoCodeViewer(wx
.TextCtrl
):
406 def __init__(self
, parent
, ID
):
407 wx
.TextCtrl
.__init
__(self
, parent
, ID
, style
=
408 wx
.TE_MULTILINE | wx
.TE_READONLY |
409 wx
.HSCROLL | wx
.TE_RICH2 | wx
.TE_NOHIDESEL
)
412 #---------------------------------------------------------------------------
415 """Convert paths to the platform-specific separator"""
416 return apply(os
.path
.join
, tuple(path
.split('/')))
419 #---------------------------------------------------------------------------
421 class wxPythonDemo(wx
.Frame
):
422 overviewText
= "wxPython Overview"
424 def __init__(self
, parent
, id, title
):
425 wx
.Frame
.__init
__(self
, parent
, -1, title
, size
= (800, 600),
426 style
=wx
.DEFAULT_FRAME_STYLE|wx
.NO_FULL_REPAINT_ON_RESIZE
)
429 self
.cwd
= os
.getcwd()
430 self
.curOverview
= ""
433 icon
= images
.getMondrianIcon()
436 if wx
.Platform
!= '__WXMAC__':
437 # setup a taskbar icon, and catch some events from it
438 dim
= 16 # (may want to use 22 on wxGTK...)
439 icon
= wx
.IconFromBitmap(
440 images
.getMondrianImage().Scale(dim
,dim
).ConvertToBitmap() )
441 #icon = wx.Icon('bmp_source/mondrian.ico', wx.BITMAP_TYPE_ICO)
442 #icon = images.getMondrianIcon()
443 self
.tbicon
= wx
.TaskBarIcon()
444 self
.tbicon
.SetIcon(icon
, "wxPython Demo")
445 self
.tbicon
.Bind(wx
.EVT_TASKBAR_LEFT_DCLICK
, self
.OnTaskBarActivate
)
446 self
.tbicon
.Bind(wx
.EVT_TASKBAR_RIGHT_UP
, self
.OnTaskBarMenu
)
447 self
.tbicon
.Bind(wx
.EVT_MENU
, self
.OnTaskBarActivate
, id=self
.TBMENU_RESTORE
)
448 self
.tbicon
.Bind(wx
.EVT_MENU
, self
.OnTaskBarClose
, id=self
.TBMENU_CLOSE
)
450 wx
.CallAfter(self
.ShowTip
)
453 self
.Bind(wx
.EVT_IDLE
, self
.OnIdle
)
454 self
.Bind(wx
.EVT_CLOSE
, self
.OnCloseWindow
)
455 self
.Bind(wx
.EVT_ICONIZE
, self
.OnIconfiy
)
456 self
.Bind(wx
.EVT_MAXIMIZE
, self
.OnMaximize
)
459 self
.CreateStatusBar(1, wx
.ST_SIZEGRIP
)
461 splitter
= wx
.SplitterWindow(self
, -1, style
=wx
.CLIP_CHILDREN | wx
.SP_LIVE_UPDATE | wx
.SP_3D
)
462 splitter2
= wx
.SplitterWindow(splitter
, -1, style
=wx
.CLIP_CHILDREN | wx
.SP_LIVE_UPDATE | wx
.SP_3D
)
464 # Set up a log on the View Log Notebook page
465 self
.log
= wx
.TextCtrl(splitter2
, -1,
466 style
= wx
.TE_MULTILINE|wx
.TE_READONLY|wx
.HSCROLL
)
468 # Set the wxWindows log target to be this textctrl
469 #wx.Log_SetActiveTarget(wx.LogTextCtrl(self.log))
471 # But instead of the above we want to show how to use our own wx.Log class
472 wx
.Log_SetActiveTarget(MyLog(self
.log
))
474 # for serious debugging
475 #wx.Log_SetActiveTarget(wx.LogStderr())
476 #wx.Log_SetTraceMask(wx.TraceMessages)
480 def EmptyHandler(evt
): pass
481 #splitter.Bind(wx.EVT_ERASE_BACKGROUND, EmptyHandler)
482 #splitter2.Bind(wx.EVT_ERASE_BACKGROUND, EmptyHandler)
484 # Prevent TreeCtrl from displaying all items after destruction when True
488 self
.mainmenu
= wx
.MenuBar()
490 item
= menu
.Append(-1, '&Redirect Output',
491 'Redirect print statements to a window',
493 self
.Bind(wx
.EVT_MENU
, self
.OnToggleRedirect
, item
)
495 item
= menu
.Append(-1, 'E&xit\tAlt-X', 'Get the heck outta here!')
496 self
.Bind(wx
.EVT_MENU
, self
.OnFileExit
, item
)
497 wx
.App_SetMacExitMenuItemId(item
.GetId())
499 self
.mainmenu
.Append(menu
, '&File')
503 for item
in _treeList
:
505 for childItem
in item
[1]:
506 mi
= submenu
.Append(-1, childItem
)
507 self
.Bind(wx
.EVT_MENU
, self
.OnDemoMenu
, mi
)
508 menu
.AppendMenu(wx
.NewId(), item
[0], submenu
)
509 self
.mainmenu
.Append(menu
, '&Demo')
515 findnextID
= wx
.NewId()
517 findItem
= menu
.Append(-1, '&Find\tCtrl-F', 'Find in the Demo Code')
518 findnextItem
= menu
.Append(-1, 'Find &Next\tF3', 'Find Next')
519 menu
.AppendSeparator()
520 helpItem
= menu
.Append(-1, '&About\tCtrl-H', 'wxPython RULES!!!')
521 wx
.App_SetMacAboutMenuItemId(helpItem
.GetId())
522 self
.Bind(wx
.EVT_MENU
, self
.OnHelpAbout
, helpItem
)
523 self
.Bind(wx
.EVT_MENU
, self
.OnHelpFind
, findItem
)
524 self
.Bind(wx
.EVT_MENU
, self
.OnFindNext
, findnextItem
)
525 self
.Bind(wx
.EVT_COMMAND_FIND
, self
.OnFind
)
526 self
.Bind(wx
.EVT_COMMAND_FIND_NEXT
, self
.OnFind
)
527 self
.Bind(wx
.EVT_COMMAND_FIND_CLOSE
, self
.OnFindClose
)
528 self
.mainmenu
.Append(menu
, '&Help')
529 self
.SetMenuBar(self
.mainmenu
)
531 self
.finddata
= wx
.FindReplaceData()
534 # This is another way to set Accelerators, in addition to
535 # using the '\t<key>' syntax in the menu items.
536 aTable
= wx
.AcceleratorTable([(wx
.ACCEL_ALT
, ord('X'), exitID
),
537 (wx
.ACCEL_CTRL
, ord('H'), helpID
),
538 (wx
.ACCEL_CTRL
, ord('F'), findID
),
539 (wx
.ACCEL_NORMAL
, WXK_F3
, findnextID
)
541 self
.SetAcceleratorTable(aTable
)
547 self
.tree
= wx
.TreeCtrl(splitter
, tID
, style
=
548 wx
.TR_DEFAULT_STYLE
#| wx.TR_HAS_VARIABLE_ROW_HEIGHT
551 root
= self
.tree
.AddRoot("wxPython Overview")
553 for item
in _treeList
:
554 child
= self
.tree
.AppendItem(root
, item
[0])
555 if not firstChild
: firstChild
= child
556 for childItem
in item
[1]:
557 theDemo
= self
.tree
.AppendItem(child
, childItem
)
558 self
.treeMap
[childItem
] = theDemo
560 self
.tree
.Expand(root
)
561 self
.tree
.Expand(firstChild
)
562 self
.tree
.Bind(wx
.EVT_TREE_ITEM_EXPANDED
, self
.OnItemExpanded
, id=tID
)
563 self
.tree
.Bind(wx
.EVT_TREE_ITEM_COLLAPSED
, self
.OnItemCollapsed
, id=tID
)
564 self
.tree
.Bind(wx
.EVT_TREE_SEL_CHANGED
, self
.OnSelChanged
, id=tID
)
565 self
.tree
.Bind(wx
.EVT_LEFT_DOWN
, self
.OnTreeLeftDown
)
568 self
.nb
= wx
.Notebook(splitter2
, -1, style
=wx
.CLIP_CHILDREN
)
570 # Set up a wx.html.HtmlWindow on the Overview Notebook page
571 # we put it in a panel first because there seems to be a
572 # refresh bug of some sort (wxGTK) when it is directly in
575 self
.ovr
= wx
.html
.HtmlWindow(self
.nb
, -1, size
=(400, 400))
576 self
.nb
.AddPage(self
.ovr
, self
.overviewText
)
578 else: # hopefully I can remove this hacky code soon, see SF bug #216861
579 panel
= wx
.Panel(self
.nb
, -1, style
=wx
.CLIP_CHILDREN
)
580 self
.ovr
= wx
.html
.HtmlWindow(panel
, -1, size
=(400, 400))
581 self
.nb
.AddPage(panel
, self
.overviewText
)
583 def OnOvrSize(evt
, ovr
=self
.ovr
):
584 ovr
.SetSize(evt
.GetSize())
586 panel
.Bind(wx
.EVT_SIZE
, OnOvrSize
)
587 panel
.Bind(wx
.EVT_ERASE_BACKGROUND
, EmptyHandler
)
590 self
.SetOverview(self
.overviewText
, overview
)
593 # Set up a notebook page for viewing the source code of each sample
594 self
.txt
= DemoCodeViewer(self
.nb
, -1)
595 self
.nb
.AddPage(self
.txt
, "Demo Code")
596 self
.LoadDemoSource('Main.py')
599 # add the windows to the splitter and split it.
600 splitter2
.SplitHorizontally(self
.nb
, self
.log
, -120)
601 splitter
.SplitVertically(self
.tree
, splitter2
, 180)
603 splitter
.SetMinimumPaneSize(20)
604 splitter2
.SetMinimumPaneSize(20)
607 # Make the splitter on the right expand the top window when resized
608 def SplitterOnSize(evt
):
609 splitter
= evt
.GetEventObject()
610 sz
= splitter
.GetSize()
611 splitter
.SetSashPosition(sz
.height
- 120, False)
614 splitter2
.Bind(wx
.EVT_SIZE
, SplitterOnSize
)
617 # select initial items
618 self
.nb
.SetSelection(0)
619 self
.tree
.SelectItem(root
)
621 if len(sys
.argv
) == 2:
623 selectedDemo
= self
.treeMap
[sys
.argv
[1]]
627 self
.tree
.SelectItem(selectedDemo
)
628 self
.tree
.EnsureVisible(selectedDemo
)
631 ## wx.LogMessage('window handle: %s' % self.GetHandle())
634 #---------------------------------------------
635 def WriteText(self
, text
):
636 if text
[-1:] == '\n':
641 def write(self
, txt
):
644 #---------------------------------------------
645 def OnItemExpanded(self
, event
):
646 item
= event
.GetItem()
647 wx
.LogMessage("OnItemExpanded: %s" % self
.tree
.GetItemText(item
))
650 #---------------------------------------------
651 def OnItemCollapsed(self
, event
):
652 item
= event
.GetItem()
653 wx
.LogMessage("OnItemCollapsed: %s" % self
.tree
.GetItemText(item
))
656 #---------------------------------------------
657 def OnTreeLeftDown(self
, event
):
658 pt
= event
.GetPosition();
659 item
, flags
= self
.tree
.HitTest(pt
)
660 if item
== self
.tree
.GetSelection():
661 self
.SetOverview(self
.tree
.GetItemText(item
)+" Overview", self
.curOverview
)
664 #---------------------------------------------
665 def OnSelChanged(self
, event
):
669 item
= event
.GetItem()
670 itemText
= self
.tree
.GetItemText(item
)
671 self
.RunDemo(itemText
)
674 #---------------------------------------------
675 def RunDemo(self
, itemText
):
677 if self
.nb
.GetPageCount() == 3:
678 if self
.nb
.GetSelection() == 2:
679 self
.nb
.SetSelection(0)
680 # inform the window that it's time to quit if it cares
681 if self
.window
is not None:
682 if hasattr(self
.window
, "ShutdownDemo"):
683 self
.window
.ShutdownDemo()
684 wx
.SafeYield() # in case the page has pending events
685 self
.nb
.DeletePage(2)
687 if itemText
== self
.overviewText
:
688 self
.LoadDemoSource('Main.py')
689 self
.SetOverview(self
.overviewText
, overview
)
693 if os
.path
.exists(itemText
+ '.py'):
695 wx
.LogMessage("Running demo %s.py..." % itemText
)
697 self
.LoadDemoSource(itemText
+ '.py')
699 if (sys
.modules
.has_key(itemText
)):
700 reload(sys
.modules
[itemText
])
702 module
= __import__(itemText
, globals())
703 self
.SetOverview(itemText
+ " Overview", module
.overview
)
708 self
.window
= module
.runTest(self
, self
.nb
, self
) ###
709 if self
.window
is not None:
710 self
.nb
.AddPage(self
.window
, 'Demo')
711 self
.nb
.SetSelection(2)
721 #---------------------------------------------
723 def LoadDemoSource(self
, filename
):
726 self
.txt
.SetValue(open(filename
).read())
728 self
.txt
.SetValue("Cannot open %s file." % filename
)
730 self
.txt
.SetInsertionPoint(0)
731 self
.txt
.ShowPosition(0)
733 #---------------------------------------------
734 def SetOverview(self
, name
, text
):
735 self
.curOverview
= text
737 if lead
!= '<html>' and lead
!= '<HTML>':
738 text
= '<br>'.join(text
.split('\n'))
739 self
.ovr
.SetPage(text
)
740 self
.nb
.SetPageText(0, name
)
742 #---------------------------------------------
744 def OnFileExit(self
, *event
):
747 def OnToggleRedirect(self
, event
):
751 print "Print statements and other standard output will now be directed to this window."
754 print "Print statements and other standard output will now be sent to the usual location."
756 def OnHelpAbout(self
, event
):
757 from About
import MyAboutBox
758 about
= MyAboutBox(self
)
762 def OnHelpFind(self
, event
):
763 self
.nb
.SetSelection(1)
764 self
.finddlg
= wx
.FindReplaceDialog(self
, self
.finddata
, "Find",
768 self
.finddlg
.Show(True)
770 def OnFind(self
, event
):
771 self
.nb
.SetSelection(1)
772 end
= self
.txt
.GetLastPosition()
773 textstring
= self
.txt
.GetRange(0, end
).lower()
774 start
= self
.txt
.GetSelection()[1]
775 findstring
= self
.finddata
.GetFindString().lower()
776 loc
= textstring
.find(findstring
, start
)
777 if loc
== -1 and start
!= 0:
778 # string not found, start at beginning
780 loc
= textstring
.find(findstring
, start
)
782 dlg
= wx
.MessageDialog(self
, 'Find String Not Found',
783 'Find String Not Found in Demo File',
784 wx
.OK | wx
.ICON_INFORMATION
)
789 self
.finddlg
.SetFocus()
792 self
.finddlg
.Destroy()
793 self
.txt
.ShowPosition(loc
)
794 self
.txt
.SetSelection(loc
, loc
+ len(findstring
))
798 def OnFindNext(self
, event
):
799 if self
.finddata
.GetFindString():
802 self
.OnHelpFind(event
)
804 def OnFindClose(self
, event
):
805 event
.GetDialog().Destroy()
808 #---------------------------------------------
809 def OnCloseWindow(self
, event
):
816 #---------------------------------------------
817 def OnIdle(self
, event
):
819 self
.otherWin
.Raise()
820 self
.window
= self
.otherWin
824 #---------------------------------------------
827 showTipText
= open(opj("data/showTips")).read()
828 showTip
, index
= eval(showTipText
)
830 showTip
, index
= (1, 0)
832 tp
= wx
.CreateFileTipProvider(opj("data/tips.txt"), index
)
834 showTip
= wx
.ShowTip(self
, tp
)
835 index
= tp
.GetCurrentTip()
836 open(opj("data/showTips"), "w").write(str( (showTip
, index
) ))
839 #---------------------------------------------
840 def OnDemoMenu(self
, event
):
842 selectedDemo
= self
.treeMap
[self
.mainmenu
.GetLabel(event
.GetId())]
846 self
.tree
.SelectItem(selectedDemo
)
847 self
.tree
.EnsureVisible(selectedDemo
)
850 #---------------------------------------------
851 def OnTaskBarActivate(self
, evt
):
852 if self
.IsIconized():
854 if not self
.IsShown():
858 #---------------------------------------------
860 TBMENU_RESTORE
= 1000
863 def OnTaskBarMenu(self
, evt
):
865 menu
.Append(self
.TBMENU_RESTORE
, "Restore wxPython Demo")
866 menu
.Append(self
.TBMENU_CLOSE
, "Close")
867 self
.tbicon
.PopupMenu(menu
)
870 #---------------------------------------------
871 def OnTaskBarClose(self
, evt
):
874 # because of the way wx.TaskBarIcon.PopupMenu is implemented we have to
875 # prod the main idle handler a bit to get the window to actually close
876 wx
.GetApp().ProcessIdle()
879 #---------------------------------------------
880 def OnIconfiy(self
, evt
):
881 wx
.LogMessage("OnIconfiy")
884 #---------------------------------------------
885 def OnMaximize(self
, evt
):
886 wx
.LogMessage("OnMaximize")
892 #---------------------------------------------------------------------------
893 #---------------------------------------------------------------------------
895 class MySplashScreen(wx
.SplashScreen
):
897 bmp
= wx
.Image(opj("bitmaps/splash.gif")).ConvertToBitmap()
898 wx
.SplashScreen
.__init
__(self
, bmp
,
899 wx
.SPLASH_CENTRE_ON_SCREEN | wx
.SPLASH_TIMEOUT
,
901 self
.Bind(wx
.EVT_CLOSE
, self
.OnClose
)
903 def OnClose(self
, evt
):
905 frame
= wxPythonDemo(None, -1, "wxPython: (A Demonstration)")
907 evt
.Skip() # Make sure the default handler runs too...
913 Create and show the splash screen. It will then create and show
914 the main frame when it is time to do so.
917 # Normally when using a SplashScreen you would create it, show
918 # it and then continue on with the applicaiton's
919 # initialization, finally creating and showing the main
920 # application window(s). In this case we have nothing else to
921 # do so we'll delay showing the main frame until later (see
922 # OnClose above) so the users can see the SplashScreen effect.
923 splash
= MySplashScreen()
930 #---------------------------------------------------------------------------
934 demoPath
= os
.path
.dirname(__file__
)
938 app
= MyApp(0) ##wx.Platform == "__WXMAC__")
942 #---------------------------------------------------------------------------
946 overview
= """<html><body>
949 <p> wxPython is a <b>GUI toolkit</b> for the Python programming
950 language. It allows Python programmers to create programs with a
951 robust, highly functional graphical user interface, simply and easily.
952 It is implemented as a Python extension module (native code) that
953 wraps the popular wxWindows cross platform GUI library, which is
956 <p> Like Python and wxWindows, wxPython is <b>Open Source</b> which
957 means that it is free for anyone to use and the source code is
958 available for anyone to look at and modify. Or anyone can contribute
959 fixes or enhancements to the project.
961 <p> wxPython is a <b>cross-platform</b> toolkit. This means that the
962 same program will run on multiple platforms without modification.
963 Currently supported platforms are 32-bit Microsoft Windows, most Unix
964 or unix-like systems, and Macintosh OS X. Since the language is
965 Python, wxPython programs are <b>simple, easy</b> to write and easy to
968 <p> <b>This demo</b> is not only a collection of test cases for
969 wxPython, but is also designed to help you learn about and how to use
970 wxPython. Each sample is listed in the tree control on the left.
971 When a sample is selected in the tree then a module is loaded and run
972 (usually in a tab of this notebook,) and the source code of the module
973 is loaded in another tab for you to browse and learn from.
978 #----------------------------------------------------------------------------
979 #----------------------------------------------------------------------------
981 if __name__
== '__main__':
984 #----------------------------------------------------------------------------