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
):
265 value
= value
.decode('iso8859_1')
266 self
.SetReadOnly(False)
268 self
.SetReadOnly(True)
273 def SetInsertionPoint(self
, pos
):
274 self
.SetCurrentPos(pos
)
276 def ShowPosition(self
, pos
):
279 def GetLastPosition(self
):
280 return self
.GetLength()
282 def GetRange(self
, start
, end
):
283 return self
.GetTextRange(start
, end
)
285 def GetSelection(self
):
286 return self
.GetAnchor(), self
.GetCurrentPos()
288 def SetSelection(self
, start
, end
):
289 self
.SetSelectionStart(start
)
290 self
.SetSelectionEnd(end
)
292 def SetUpEditor(self
):
294 This method carries out the work of setting up the demo editor.
295 It's seperate so as not to clutter up the init code.
299 self
.SetLexer(stc
.STC_LEX_PYTHON
)
300 self
.SetKeyWords(0, " ".join(keyword
.kwlist
))
303 self
.SetProperty("fold", "1" )
305 # Highlight tab/space mixing (shouldn't be any)
306 self
.SetProperty("tab.timmy.whinge.level", "1")
308 # Set left and right margins
311 # Set up the numbers in the margin for margin #1
312 self
.SetMarginType(1, wx
.stc
.STC_MARGIN_NUMBER
)
313 # Reasonable value for, say, 4-5 digits using a mono font (40 pix)
314 self
.SetMarginWidth(1, 40)
316 # Indentation and tab stuff
317 self
.SetIndent(4) # Proscribed indent size for wx
318 self
.SetIndentationGuides(True) # Show indent guides
319 self
.SetBackSpaceUnIndents(True)# Backspace unindents rather than delete 1 space
320 self
.SetTabIndents(True) # Tab key indents
321 self
.SetTabWidth(4) # Proscribed tab size for wx
322 self
.SetUseTabs(False) # Use spaces rather than tabs, or
323 # TabTimmy will complain!
325 self
.SetViewWhiteSpace(False) # Don't view white space
328 #self.SetEOLMode(wx.stc.STC_EOL_CRLF) # Just leave it at the default (autosense)
329 self
.SetViewEOL(False)
330 # No right-edge mode indicator
331 self
.SetEdgeMode(stc
.STC_EDGE_NONE
)
333 # Setup a margin to hold fold markers
334 self
.SetMarginType(2, stc
.STC_MARGIN_SYMBOL
)
335 self
.SetMarginMask(2, stc
.STC_MASK_FOLDERS
)
336 self
.SetMarginSensitive(2, True)
337 self
.SetMarginWidth(2, 12)
339 # and now set up the fold markers
340 self
.MarkerDefine(stc
.STC_MARKNUM_FOLDEREND
, stc
.STC_MARK_BOXPLUSCONNECTED
, "white", "black")
341 self
.MarkerDefine(stc
.STC_MARKNUM_FOLDEROPENMID
, stc
.STC_MARK_BOXMINUSCONNECTED
, "white", "black")
342 self
.MarkerDefine(stc
.STC_MARKNUM_FOLDERMIDTAIL
, stc
.STC_MARK_TCORNER
, "white", "black")
343 self
.MarkerDefine(stc
.STC_MARKNUM_FOLDERTAIL
, stc
.STC_MARK_LCORNER
, "white", "black")
344 self
.MarkerDefine(stc
.STC_MARKNUM_FOLDERSUB
, stc
.STC_MARK_VLINE
, "white", "black")
345 self
.MarkerDefine(stc
.STC_MARKNUM_FOLDER
, stc
.STC_MARK_BOXPLUS
, "white", "black")
346 self
.MarkerDefine(stc
.STC_MARKNUM_FOLDEROPEN
, stc
.STC_MARK_BOXMINUS
, "white", "black")
348 # Global default style
349 if wx
.Platform
== '__WXMSW__':
350 self
.StyleSetSpec(stc
.STC_STYLE_DEFAULT
,
351 'fore:#000000,back:#FFFFFF,face:Courier New,size:9')
353 self
.StyleSetSpec(stc
.STC_STYLE_DEFAULT
,
354 'fore:#000000,back:#FFFFFF,face:Courier,size:12')
356 # Clear styles and revert to default.
359 # Following style specs only indicate differences from default.
360 # The rest remains unchanged.
362 # Line numbers in margin
363 self
.StyleSetSpec(wx
.stc
.STC_STYLE_LINENUMBER
,'fore:#000000,back:#99A9C2')
366 self
.StyleSetSpec(wx
.stc
.STC_STYLE_BRACELIGHT
,'fore:#00009D,back:#FFFF00')
368 self
.StyleSetSpec(wx
.stc
.STC_STYLE_BRACEBAD
,'fore:#00009D,back:#FF0000')
370 self
.StyleSetSpec(wx
.stc
.STC_STYLE_INDENTGUIDE
, "fore:#CDCDCD")
373 self
.StyleSetSpec(wx
.stc
.STC_P_DEFAULT
, 'fore:#000000')
375 self
.StyleSetSpec(wx
.stc
.STC_P_COMMENTLINE
, 'fore:#008000,back:#F0FFF0')
376 self
.StyleSetSpec(wx
.stc
.STC_P_COMMENTBLOCK
, 'fore:#008000,back:#F0FFF0')
378 self
.StyleSetSpec(wx
.stc
.STC_P_NUMBER
, 'fore:#008080')
379 # Strings and characters
380 self
.StyleSetSpec(wx
.stc
.STC_P_STRING
, 'fore:#800080')
381 self
.StyleSetSpec(wx
.stc
.STC_P_CHARACTER
, 'fore:#800080')
383 self
.StyleSetSpec(wx
.stc
.STC_P_WORD
, 'fore:#000080,bold')
385 self
.StyleSetSpec(wx
.stc
.STC_P_TRIPLE
, 'fore:#800080,back:#FFFFEA')
386 self
.StyleSetSpec(wx
.stc
.STC_P_TRIPLEDOUBLE
, 'fore:#800080,back:#FFFFEA')
388 self
.StyleSetSpec(wx
.stc
.STC_P_CLASSNAME
, 'fore:#0000FF,bold')
390 self
.StyleSetSpec(wx
.stc
.STC_P_DEFNAME
, 'fore:#008080,bold')
392 self
.StyleSetSpec(wx
.stc
.STC_P_OPERATOR
, 'fore:#800000,bold')
393 # Identifiers. I leave this as not bold because everything seems
394 # to be an identifier if it doesn't match the above criterae
395 self
.StyleSetSpec(wx
.stc
.STC_P_IDENTIFIER
, 'fore:#000000')
398 self
.SetCaretForeground("BLUE")
399 # Selection background
400 self
.SetSelBackground(1, '#66CCFF')
402 self
.SetSelBackground(True, wx
.SystemSettings_GetColour(wx
.SYS_COLOUR_HIGHLIGHT
))
403 self
.SetSelForeground(True, wx
.SystemSettings_GetColour(wx
.SYS_COLOUR_HIGHLIGHTTEXT
))
407 class DemoCodeViewer(wx
.TextCtrl
):
408 def __init__(self
, parent
, ID
):
409 wx
.TextCtrl
.__init
__(self
, parent
, ID
, style
=
410 wx
.TE_MULTILINE | wx
.TE_READONLY |
411 wx
.HSCROLL | wx
.TE_RICH2 | wx
.TE_NOHIDESEL
)
414 #---------------------------------------------------------------------------
417 """Convert paths to the platform-specific separator"""
418 return apply(os
.path
.join
, tuple(path
.split('/')))
421 #---------------------------------------------------------------------------
423 class wxPythonDemo(wx
.Frame
):
424 overviewText
= "wxPython Overview"
426 def __init__(self
, parent
, id, title
):
427 wx
.Frame
.__init
__(self
, parent
, -1, title
, size
= (800, 600),
428 style
=wx
.DEFAULT_FRAME_STYLE|wx
.NO_FULL_REPAINT_ON_RESIZE
)
431 self
.cwd
= os
.getcwd()
432 self
.curOverview
= ""
435 icon
= images
.getMondrianIcon()
438 if wx
.Platform
!= '__WXMAC__':
439 # setup a taskbar icon, and catch some events from it
440 dim
= 16 # (may want to use 22 on wxGTK...)
441 icon
= wx
.IconFromBitmap(
442 images
.getMondrianImage().Scale(dim
,dim
).ConvertToBitmap() )
443 #icon = wx.Icon('bmp_source/mondrian.ico', wx.BITMAP_TYPE_ICO)
444 #icon = images.getMondrianIcon()
445 self
.tbicon
= wx
.TaskBarIcon()
446 self
.tbicon
.SetIcon(icon
, "wxPython Demo")
447 self
.tbicon
.Bind(wx
.EVT_TASKBAR_LEFT_DCLICK
, self
.OnTaskBarActivate
)
448 self
.tbicon
.Bind(wx
.EVT_TASKBAR_RIGHT_UP
, self
.OnTaskBarMenu
)
449 self
.tbicon
.Bind(wx
.EVT_MENU
, self
.OnTaskBarActivate
, id=self
.TBMENU_RESTORE
)
450 self
.tbicon
.Bind(wx
.EVT_MENU
, self
.OnTaskBarClose
, id=self
.TBMENU_CLOSE
)
452 wx
.CallAfter(self
.ShowTip
)
455 self
.Bind(wx
.EVT_IDLE
, self
.OnIdle
)
456 self
.Bind(wx
.EVT_CLOSE
, self
.OnCloseWindow
)
457 self
.Bind(wx
.EVT_ICONIZE
, self
.OnIconfiy
)
458 self
.Bind(wx
.EVT_MAXIMIZE
, self
.OnMaximize
)
461 self
.CreateStatusBar(1, wx
.ST_SIZEGRIP
)
463 splitter
= wx
.SplitterWindow(self
, -1, style
=wx
.CLIP_CHILDREN | wx
.SP_LIVE_UPDATE | wx
.SP_3D
)
464 splitter2
= wx
.SplitterWindow(splitter
, -1, style
=wx
.CLIP_CHILDREN | wx
.SP_LIVE_UPDATE | wx
.SP_3D
)
466 # Set up a log on the View Log Notebook page
467 self
.log
= wx
.TextCtrl(splitter2
, -1,
468 style
= wx
.TE_MULTILINE|wx
.TE_READONLY|wx
.HSCROLL
)
470 # Set the wxWindows log target to be this textctrl
471 #wx.Log_SetActiveTarget(wx.LogTextCtrl(self.log))
473 # But instead of the above we want to show how to use our own wx.Log class
474 wx
.Log_SetActiveTarget(MyLog(self
.log
))
476 # for serious debugging
477 #wx.Log_SetActiveTarget(wx.LogStderr())
478 #wx.Log_SetTraceMask(wx.TraceMessages)
482 def EmptyHandler(evt
): pass
483 #splitter.Bind(wx.EVT_ERASE_BACKGROUND, EmptyHandler)
484 #splitter2.Bind(wx.EVT_ERASE_BACKGROUND, EmptyHandler)
486 # Prevent TreeCtrl from displaying all items after destruction when True
490 self
.mainmenu
= wx
.MenuBar()
492 item
= menu
.Append(-1, '&Redirect Output',
493 'Redirect print statements to a window',
495 self
.Bind(wx
.EVT_MENU
, self
.OnToggleRedirect
, item
)
497 item
= menu
.Append(-1, 'E&xit\tAlt-X', 'Get the heck outta here!')
498 self
.Bind(wx
.EVT_MENU
, self
.OnFileExit
, item
)
499 wx
.App_SetMacExitMenuItemId(item
.GetId())
501 self
.mainmenu
.Append(menu
, '&File')
505 for item
in _treeList
:
507 for childItem
in item
[1]:
508 mi
= submenu
.Append(-1, childItem
)
509 self
.Bind(wx
.EVT_MENU
, self
.OnDemoMenu
, mi
)
510 menu
.AppendMenu(wx
.NewId(), item
[0], submenu
)
511 self
.mainmenu
.Append(menu
, '&Demo')
517 findnextID
= wx
.NewId()
519 findItem
= menu
.Append(-1, '&Find\tCtrl-F', 'Find in the Demo Code')
520 findnextItem
= menu
.Append(-1, 'Find &Next\tF3', 'Find Next')
521 menu
.AppendSeparator()
522 helpItem
= menu
.Append(-1, '&About\tCtrl-H', 'wxPython RULES!!!')
523 wx
.App_SetMacAboutMenuItemId(helpItem
.GetId())
524 self
.Bind(wx
.EVT_MENU
, self
.OnHelpAbout
, helpItem
)
525 self
.Bind(wx
.EVT_MENU
, self
.OnHelpFind
, findItem
)
526 self
.Bind(wx
.EVT_MENU
, self
.OnFindNext
, findnextItem
)
527 self
.Bind(wx
.EVT_COMMAND_FIND
, self
.OnFind
)
528 self
.Bind(wx
.EVT_COMMAND_FIND_NEXT
, self
.OnFind
)
529 self
.Bind(wx
.EVT_COMMAND_FIND_CLOSE
, self
.OnFindClose
)
530 self
.mainmenu
.Append(menu
, '&Help')
531 self
.SetMenuBar(self
.mainmenu
)
533 self
.finddata
= wx
.FindReplaceData()
536 # This is another way to set Accelerators, in addition to
537 # using the '\t<key>' syntax in the menu items.
538 aTable
= wx
.AcceleratorTable([(wx
.ACCEL_ALT
, ord('X'), exitID
),
539 (wx
.ACCEL_CTRL
, ord('H'), helpID
),
540 (wx
.ACCEL_CTRL
, ord('F'), findID
),
541 (wx
.ACCEL_NORMAL
, WXK_F3
, findnextID
)
543 self
.SetAcceleratorTable(aTable
)
549 self
.tree
= wx
.TreeCtrl(splitter
, tID
, style
=
550 wx
.TR_DEFAULT_STYLE
#| wx.TR_HAS_VARIABLE_ROW_HEIGHT
553 root
= self
.tree
.AddRoot("wxPython Overview")
555 for item
in _treeList
:
556 child
= self
.tree
.AppendItem(root
, item
[0])
557 if not firstChild
: firstChild
= child
558 for childItem
in item
[1]:
559 theDemo
= self
.tree
.AppendItem(child
, childItem
)
560 self
.treeMap
[childItem
] = theDemo
562 self
.tree
.Expand(root
)
563 self
.tree
.Expand(firstChild
)
564 self
.tree
.Bind(wx
.EVT_TREE_ITEM_EXPANDED
, self
.OnItemExpanded
, id=tID
)
565 self
.tree
.Bind(wx
.EVT_TREE_ITEM_COLLAPSED
, self
.OnItemCollapsed
, id=tID
)
566 self
.tree
.Bind(wx
.EVT_TREE_SEL_CHANGED
, self
.OnSelChanged
, id=tID
)
567 self
.tree
.Bind(wx
.EVT_LEFT_DOWN
, self
.OnTreeLeftDown
)
570 self
.nb
= wx
.Notebook(splitter2
, -1, style
=wx
.CLIP_CHILDREN
)
572 # Set up a wx.html.HtmlWindow on the Overview Notebook page
573 # we put it in a panel first because there seems to be a
574 # refresh bug of some sort (wxGTK) when it is directly in
577 self
.ovr
= wx
.html
.HtmlWindow(self
.nb
, -1, size
=(400, 400))
578 self
.nb
.AddPage(self
.ovr
, self
.overviewText
)
580 else: # hopefully I can remove this hacky code soon, see SF bug #216861
581 panel
= wx
.Panel(self
.nb
, -1, style
=wx
.CLIP_CHILDREN
)
582 self
.ovr
= wx
.html
.HtmlWindow(panel
, -1, size
=(400, 400))
583 self
.nb
.AddPage(panel
, self
.overviewText
)
585 def OnOvrSize(evt
, ovr
=self
.ovr
):
586 ovr
.SetSize(evt
.GetSize())
588 panel
.Bind(wx
.EVT_SIZE
, OnOvrSize
)
589 panel
.Bind(wx
.EVT_ERASE_BACKGROUND
, EmptyHandler
)
592 self
.SetOverview(self
.overviewText
, overview
)
595 # Set up a notebook page for viewing the source code of each sample
596 self
.txt
= DemoCodeViewer(self
.nb
, -1)
597 self
.nb
.AddPage(self
.txt
, "Demo Code")
598 self
.LoadDemoSource('Main.py')
601 # add the windows to the splitter and split it.
602 splitter2
.SplitHorizontally(self
.nb
, self
.log
, -120)
603 splitter
.SplitVertically(self
.tree
, splitter2
, 180)
605 splitter
.SetMinimumPaneSize(20)
606 splitter2
.SetMinimumPaneSize(20)
609 # Make the splitter on the right expand the top window when resized
610 def SplitterOnSize(evt
):
611 splitter
= evt
.GetEventObject()
612 sz
= splitter
.GetSize()
613 splitter
.SetSashPosition(sz
.height
- 120, False)
616 splitter2
.Bind(wx
.EVT_SIZE
, SplitterOnSize
)
619 # select initial items
620 self
.nb
.SetSelection(0)
621 self
.tree
.SelectItem(root
)
623 if len(sys
.argv
) == 2:
625 selectedDemo
= self
.treeMap
[sys
.argv
[1]]
629 self
.tree
.SelectItem(selectedDemo
)
630 self
.tree
.EnsureVisible(selectedDemo
)
633 ## wx.LogMessage('window handle: %s' % self.GetHandle())
636 #---------------------------------------------
637 def WriteText(self
, text
):
638 if text
[-1:] == '\n':
643 def write(self
, txt
):
646 #---------------------------------------------
647 def OnItemExpanded(self
, event
):
648 item
= event
.GetItem()
649 wx
.LogMessage("OnItemExpanded: %s" % self
.tree
.GetItemText(item
))
652 #---------------------------------------------
653 def OnItemCollapsed(self
, event
):
654 item
= event
.GetItem()
655 wx
.LogMessage("OnItemCollapsed: %s" % self
.tree
.GetItemText(item
))
658 #---------------------------------------------
659 def OnTreeLeftDown(self
, event
):
660 pt
= event
.GetPosition();
661 item
, flags
= self
.tree
.HitTest(pt
)
662 if item
== self
.tree
.GetSelection():
663 self
.SetOverview(self
.tree
.GetItemText(item
)+" Overview", self
.curOverview
)
666 #---------------------------------------------
667 def OnSelChanged(self
, event
):
671 item
= event
.GetItem()
672 itemText
= self
.tree
.GetItemText(item
)
673 self
.RunDemo(itemText
)
676 #---------------------------------------------
677 def RunDemo(self
, itemText
):
679 if self
.nb
.GetPageCount() == 3:
680 if self
.nb
.GetSelection() == 2:
681 self
.nb
.SetSelection(0)
682 # inform the window that it's time to quit if it cares
683 if self
.window
is not None:
684 if hasattr(self
.window
, "ShutdownDemo"):
685 self
.window
.ShutdownDemo()
686 wx
.SafeYield() # in case the page has pending events
687 self
.nb
.DeletePage(2)
689 if itemText
== self
.overviewText
:
690 self
.LoadDemoSource('Main.py')
691 self
.SetOverview(self
.overviewText
, overview
)
695 if os
.path
.exists(itemText
+ '.py'):
697 wx
.LogMessage("Running demo %s.py..." % itemText
)
699 self
.LoadDemoSource(itemText
+ '.py')
701 if (sys
.modules
.has_key(itemText
)):
702 reload(sys
.modules
[itemText
])
704 module
= __import__(itemText
, globals())
705 self
.SetOverview(itemText
+ " Overview", module
.overview
)
710 self
.window
= module
.runTest(self
, self
.nb
, self
) ###
711 if self
.window
is not None:
712 self
.nb
.AddPage(self
.window
, 'Demo')
713 self
.nb
.SetSelection(2)
723 #---------------------------------------------
725 def LoadDemoSource(self
, filename
):
728 self
.txt
.SetValue(open(filename
).read())
730 self
.txt
.SetValue("Cannot open %s file." % filename
)
732 self
.txt
.SetInsertionPoint(0)
733 self
.txt
.ShowPosition(0)
735 #---------------------------------------------
736 def SetOverview(self
, name
, text
):
737 self
.curOverview
= text
739 if lead
!= '<html>' and lead
!= '<HTML>':
740 text
= '<br>'.join(text
.split('\n'))
742 text
= text
.decode('iso8859_1')
743 self
.ovr
.SetPage(text
)
744 self
.nb
.SetPageText(0, name
)
746 #---------------------------------------------
748 def OnFileExit(self
, *event
):
751 def OnToggleRedirect(self
, event
):
755 print "Print statements and other standard output will now be directed to this window."
758 print "Print statements and other standard output will now be sent to the usual location."
760 def OnHelpAbout(self
, event
):
761 from About
import MyAboutBox
762 about
= MyAboutBox(self
)
766 def OnHelpFind(self
, event
):
767 self
.nb
.SetSelection(1)
768 self
.finddlg
= wx
.FindReplaceDialog(self
, self
.finddata
, "Find",
772 self
.finddlg
.Show(True)
774 def OnFind(self
, event
):
775 self
.nb
.SetSelection(1)
776 end
= self
.txt
.GetLastPosition()
777 textstring
= self
.txt
.GetRange(0, end
).lower()
778 start
= self
.txt
.GetSelection()[1]
779 findstring
= self
.finddata
.GetFindString().lower()
780 loc
= textstring
.find(findstring
, start
)
781 if loc
== -1 and start
!= 0:
782 # string not found, start at beginning
784 loc
= textstring
.find(findstring
, start
)
786 dlg
= wx
.MessageDialog(self
, 'Find String Not Found',
787 'Find String Not Found in Demo File',
788 wx
.OK | wx
.ICON_INFORMATION
)
793 self
.finddlg
.SetFocus()
796 self
.finddlg
.Destroy()
797 self
.txt
.ShowPosition(loc
)
798 self
.txt
.SetSelection(loc
, loc
+ len(findstring
))
802 def OnFindNext(self
, event
):
803 if self
.finddata
.GetFindString():
806 self
.OnHelpFind(event
)
808 def OnFindClose(self
, event
):
809 event
.GetDialog().Destroy()
812 #---------------------------------------------
813 def OnCloseWindow(self
, event
):
820 #---------------------------------------------
821 def OnIdle(self
, event
):
823 self
.otherWin
.Raise()
824 self
.window
= self
.otherWin
828 #---------------------------------------------
831 showTipText
= open(opj("data/showTips")).read()
832 showTip
, index
= eval(showTipText
)
834 showTip
, index
= (1, 0)
836 tp
= wx
.CreateFileTipProvider(opj("data/tips.txt"), index
)
838 showTip
= wx
.ShowTip(self
, tp
)
839 index
= tp
.GetCurrentTip()
840 open(opj("data/showTips"), "w").write(str( (showTip
, index
) ))
843 #---------------------------------------------
844 def OnDemoMenu(self
, event
):
846 selectedDemo
= self
.treeMap
[self
.mainmenu
.GetLabel(event
.GetId())]
850 self
.tree
.SelectItem(selectedDemo
)
851 self
.tree
.EnsureVisible(selectedDemo
)
854 #---------------------------------------------
855 def OnTaskBarActivate(self
, evt
):
856 if self
.IsIconized():
858 if not self
.IsShown():
862 #---------------------------------------------
864 TBMENU_RESTORE
= 1000
867 def OnTaskBarMenu(self
, evt
):
869 menu
.Append(self
.TBMENU_RESTORE
, "Restore wxPython Demo")
870 menu
.Append(self
.TBMENU_CLOSE
, "Close")
871 self
.tbicon
.PopupMenu(menu
)
874 #---------------------------------------------
875 def OnTaskBarClose(self
, evt
):
878 # because of the way wx.TaskBarIcon.PopupMenu is implemented we have to
879 # prod the main idle handler a bit to get the window to actually close
880 wx
.GetApp().ProcessIdle()
883 #---------------------------------------------
884 def OnIconfiy(self
, evt
):
885 wx
.LogMessage("OnIconfiy")
888 #---------------------------------------------
889 def OnMaximize(self
, evt
):
890 wx
.LogMessage("OnMaximize")
896 #---------------------------------------------------------------------------
897 #---------------------------------------------------------------------------
899 class MySplashScreen(wx
.SplashScreen
):
901 bmp
= wx
.Image(opj("bitmaps/splash.gif")).ConvertToBitmap()
902 wx
.SplashScreen
.__init
__(self
, bmp
,
903 wx
.SPLASH_CENTRE_ON_SCREEN | wx
.SPLASH_TIMEOUT
,
905 self
.Bind(wx
.EVT_CLOSE
, self
.OnClose
)
907 def OnClose(self
, evt
):
909 frame
= wxPythonDemo(None, -1, "wxPython: (A Demonstration)")
911 evt
.Skip() # Make sure the default handler runs too...
917 Create and show the splash screen. It will then create and show
918 the main frame when it is time to do so.
921 # Normally when using a SplashScreen you would create it, show
922 # it and then continue on with the applicaiton's
923 # initialization, finally creating and showing the main
924 # application window(s). In this case we have nothing else to
925 # do so we'll delay showing the main frame until later (see
926 # OnClose above) so the users can see the SplashScreen effect.
927 splash
= MySplashScreen()
934 #---------------------------------------------------------------------------
938 demoPath
= os
.path
.dirname(__file__
)
942 app
= MyApp(0) ##wx.Platform == "__WXMAC__")
946 #---------------------------------------------------------------------------
950 overview
= """<html><body>
953 <p> wxPython is a <b>GUI toolkit</b> for the Python programming
954 language. It allows Python programmers to create programs with a
955 robust, highly functional graphical user interface, simply and easily.
956 It is implemented as a Python extension module (native code) that
957 wraps the popular wxWindows cross platform GUI library, which is
960 <p> Like Python and wxWindows, wxPython is <b>Open Source</b> which
961 means that it is free for anyone to use and the source code is
962 available for anyone to look at and modify. Or anyone can contribute
963 fixes or enhancements to the project.
965 <p> wxPython is a <b>cross-platform</b> toolkit. This means that the
966 same program will run on multiple platforms without modification.
967 Currently supported platforms are 32-bit Microsoft Windows, most Unix
968 or unix-like systems, and Macintosh OS X. Since the language is
969 Python, wxPython programs are <b>simple, easy</b> to write and easy to
972 <p> <b>This demo</b> is not only a collection of test cases for
973 wxPython, but is also designed to help you learn about and how to use
974 wxPython. Each sample is listed in the tree control on the left.
975 When a sample is selected in the tree then a module is loaded and run
976 (usually in a tab of this notebook,) and the source code of the module
977 is loaded in another tab for you to browse and learn from.
982 #----------------------------------------------------------------------------
983 #----------------------------------------------------------------------------
985 if __name__
== '__main__':
988 #----------------------------------------------------------------------------