X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/1fded56b375bf7a4687af1cdb182899614c1b2a8..0c02082608f0646056053f99bdcccccd67dcaf03:/wxPython/demo/Main.py diff --git a/wxPython/demo/Main.py b/wxPython/demo/Main.py index fd557f0171..349a1a6712 100644 --- a/wxPython/demo/Main.py +++ b/wxPython/demo/Main.py @@ -18,6 +18,12 @@ import wx.html import images +# For debugging +##wx.Trap(); +##print "wx.VERSION_STRING = ", wx.VERSION_STRING +##print os.getpid(); +##raw_input("Press Enter...") + #--------------------------------------------------------------------------- @@ -25,143 +31,159 @@ import images _treeList = [ # new stuff ('Recent Additions', [ - 'wxScrolledPanel', - 'ShapedWindow', - 'NewNamespace', - 'PopupMenu', - 'AnalogClockWindow', - 'MaskedEditControls', - 'wxTreeListCtrl', - 'wxGrid_MegaExample', + 'VListBox', + 'Listbook', + 'MaskedNumCtrl', + 'FloatCanvas', + 'XmlResourceSubclass', + 'GridBagSizer', + 'Cursor', + 'PyPlot', + 'ImageAlpha', + 'ActiveX_FlashWindow', + 'ActiveX_IEHtmlWindow', + 'ActiveX_PDFWindow', ]), # managed windows == things with a (optional) caption you can close ('Base Frames and Dialogs', [ - 'wxDialog', - 'wxFrame', - 'wxMDIWindows', - 'wxMiniFrame', - 'wxWizard', + 'Dialog', + 'Frame', + 'MDIWindows', + 'MiniFrame', + 'Wizard', ]), # the common dialogs ('Common Dialogs', [ - 'wxColourDialog', - 'wxDirDialog', - 'wxFileDialog', - 'wxFileDialog_Save', - 'wxFindReplaceDialog', - 'wxFontDialog', - 'wxMessageDialog', - 'wxPageSetupDialog', - 'wxPrintDialog', - 'wxProgressDialog', - 'wxSingleChoiceDialog', - 'wxTextEntryDialog', + 'ColourDialog', + 'DirDialog', + 'FileDialog', + 'FileDialog_Save', + 'FindReplaceDialog', + 'FontDialog', + 'MessageDialog', + 'PageSetupDialog', + 'PrintDialog', + 'ProgressDialog', + 'SingleChoiceDialog', + 'TextEntryDialog', ]), # dialogs from libraries ('More Dialogs', [ - 'ErrorDialogs', 'ImageBrowser', - 'wxMultipleChoiceDialog', - 'wxScrolledMessageDialog', + 'MultipleChoiceDialog', + 'ScrolledMessageDialog', ]), # core controls ('Core Windows/Controls', [ + 'BitmapButton', + 'Button', + 'CheckBox', + 'CheckListBox', + 'Choice', + 'ComboBox', + 'Gauge', + 'Grid', + 'Grid_MegaExample', + 'ListBox', + 'ListCtrl', + 'ListCtrl_virtual', + 'Listbook', + 'Menu', + 'Notebook', 'PopupMenu', - 'wxButton', - 'wxCheckBox', - 'wxCheckListBox', - 'wxChoice', - 'wxComboBox', - 'wxGauge', - 'wxGenericDirCtrl', - 'wxGrid', - 'wxGrid_MegaExample', - 'wxListBox', - 'wxListCtrl', - 'wxListCtrl_virtual', - 'wxMenu', - 'wxNotebook', - 'wxPopupWindow', - 'wxRadioBox', - 'wxRadioButton', - 'wxSashWindow', - 'wxScrolledWindow', - 'wxSlider', - 'wxSpinButton', - 'wxSpinCtrl', - 'wxSplitterWindow', - 'wxStaticBitmap', - 'wxStaticText', - 'wxStatusBar', - 'wxTextCtrl', - 'wxToggleButton', - 'wxToolBar', - 'wxTreeCtrl', - 'wxValidator', + 'PopupWindow', + 'RadioBox', + 'RadioButton', + 'SashWindow', + 'ScrolledWindow', + 'Slider', + 'SpinButton', + 'SpinCtrl', + 'SplitterWindow', + 'StaticBitmap', + 'StaticText', + 'StatusBar', + 'TextCtrl', + 'ToggleButton', + 'ToolBar', + 'TreeCtrl', + 'Validator', ]), - # controls coming from other librairies - ('More Windows/Controls', [ - #'wxFloatBar', deprecated - #'wxMVCTree', deprecated - #'wxRightTextCtrl', deprecated as we have wxTE_RIGHT now. + ('Custom Controls', [ 'AnalogClockWindow', 'ColourSelect', + 'Editor', + 'GenericButtons', + 'GenericDirCtrl', + 'LEDNumberCtrl', + 'MultiSash', + 'PopupControl', + 'PyColourChooser', + 'TreeListCtrl', + ]), + + # controls coming from other libraries + ('More Windows/Controls', [ + 'ActiveX_FlashWindow', + 'ActiveX_IEHtmlWindow', + 'ActiveX_PDFWindow', + #'RightTextCtrl', deprecated as we have wxTE_RIGHT now. + 'Calendar', + 'CalendarCtrl', 'ContextHelp', + 'DynamicSashWindow', + 'EditableListBox', 'FancyText', 'FileBrowseButton', - 'GenericButtons', + 'FloatBar', + 'FloatCanvas', + 'HtmlWindow', + 'IntCtrl', + 'MVCTree', 'MaskedEditControls', - 'PyShell', + 'MaskedNumCtrl', + 'MimeTypesManager', 'PyCrust', + 'PyPlot', + 'PyShell', + 'ScrolledPanel', 'SplitTree', + 'StyledTextCtrl_1', + 'StyledTextCtrl_2', 'TablePrint', 'Throbber', - 'wxCalendar', - 'wxCalendarCtrl', - 'wxPyColourChooser', - 'wxDynamicSashWindow', - 'wxEditableListBox', - 'wxEditor', - 'wxHtmlWindow', - 'wxIEHtmlWin', - 'wxIntCtrl', - 'wxLEDNumberCtrl', - 'wxMimeTypesManager', - 'wxMultiSash', - 'wxPopupControl', - 'wxStyledTextCtrl_1', - 'wxStyledTextCtrl_2', - 'wxTimeCtrl', - 'wxTreeListCtrl', + 'TimeCtrl', + 'VListBox', ]), # How to lay out the controls in a frame/dialog ('Window Layout', [ + 'GridBagSizer', 'LayoutAnchors', + 'LayoutConstraints', 'Layoutf', 'RowColSizer', + 'ScrolledPanel', 'Sizers', - 'wxLayoutConstraints', - 'wxScrolledPanel', - 'wxXmlResource', - 'wxXmlResourceHandler', + 'XmlResource', + 'XmlResourceHandler', + 'XmlResourceSubclass', ]), # ditto ('Process and Events', [ 'EventManager', - 'infoframe', - 'OOR', + 'KeyEvents', + 'Process', 'PythonEvents', 'Threads', - 'wxKeyEvents', - 'wxProcess', - 'wxTimer', + 'Timer', + 'infoframe', ]), # Clipboard and DnD @@ -173,12 +195,14 @@ _treeList = [ # Images ('Using Images', [ + 'ArtProvider', + 'Cursor', + 'DragImage', + 'Image', + 'ImageAlpha', + 'ImageFromStream', + 'Mask', 'Throbber', - 'wxArtProvider', - 'wxDragImage', - 'wxImage', - 'wxImageFromStream', - 'wxMask', ]), # Other stuff @@ -186,22 +210,19 @@ _treeList = [ 'ColourDB', 'DialogUnits', 'DrawXXXList', + 'FileHistory', 'FontEnumerator', + 'Joystick', + 'OGL', 'PrintFramework', - 'Throbber', + 'ShapedWindow', + 'Sound', 'Unicode', - 'wxFileHistory', - 'wxJoystick', - 'wxOGL', - 'wxWave', ]), # need libs not coming with the demo ('Objects using an external library', [ - 'ActiveXWrapper_Acrobat', - 'ActiveXWrapper_IE', - 'wxGLCanvas', - 'wxPlotCanvas', + 'GLCanvas', ]), @@ -213,6 +234,7 @@ _treeList = [ #--------------------------------------------------------------------------- +# Show how to derive a custom wxLog class class MyLog(wx.PyLog): def __init__(self, textCtrl, logTime=0): @@ -234,19 +256,18 @@ class MyTP(wx.PyTipProvider): #--------------------------------------------------------------------------- # A class to be used to display source code in the demo. Try using the -# wxSTC in the wxStyledTextCtrl_2 sample first, fall back to wxTextCtrl +# wxSTC in the StyledTextCtrl_2 sample first, fall back to wxTextCtrl # if there is an error, such as the stc module not being present. +# try: ##raise ImportError from wx import stc - from wxStyledTextCtrl_2 import PythonSTC + from StyledTextCtrl_2 import PythonSTC class DemoCodeViewer(PythonSTC): def __init__(self, parent, ID): - PythonSTC.__init__(self, parent, ID) - self.SetEdgeMode(stc.STC_EDGE_NONE) - self.SetSelBackground(True, wx.SystemSettings_GetColour(wx.SYS_COLOUR_HIGHLIGHT)) - self.SetSelForeground(True, wx.SystemSettings_GetColour(wx.SYS_COLOUR_HIGHLIGHTTEXT)) + PythonSTC.__init__(self, parent, ID, wx.BORDER_NONE) + self.SetUpEditor() # Some methods to make it compatible with how the wxTextCtrl is used def SetValue(self, value): @@ -276,6 +297,119 @@ try: self.SetSelectionStart(start) self.SetSelectionEnd(end) + def SetUpEditor(self): + """ + This method carries out the work of setting up the demo editor. + It's seperate so as not to clutter up the init code. + """ + import keyword + + self.SetLexer(stc.STC_LEX_PYTHON) + self.SetKeyWords(0, " ".join(keyword.kwlist)) + + # Enable folding + self.SetProperty("fold", "1" ) + + # Highlight tab/space mixing (shouldn't be any) + self.SetProperty("tab.timmy.whinge.level", "1") + + # Set left and right margins + self.SetMargins(2,2) + + # Set up the numbers in the margin for margin #1 + self.SetMarginType(1, wx.stc.STC_MARGIN_NUMBER) + # Reasonable value for, say, 4-5 digits using a mono font (40 pix) + self.SetMarginWidth(1, 40) + + # Indentation and tab stuff + self.SetIndent(4) # Proscribed indent size for wx + self.SetIndentationGuides(True) # Show indent guides + self.SetBackSpaceUnIndents(True)# Backspace unindents rather than delete 1 space + self.SetTabIndents(True) # Tab key indents + self.SetTabWidth(4) # Proscribed tab size for wx + self.SetUseTabs(False) # Use spaces rather than tabs, or + # TabTimmy will complain! + # White space + self.SetViewWhiteSpace(False) # Don't view white space + + # EOL + #self.SetEOLMode(wx.stc.STC_EOL_CRLF) # Just leave it at the default (autosense) + self.SetViewEOL(False) + # No right-edge mode indicator + self.SetEdgeMode(stc.STC_EDGE_NONE) + + # Setup a margin to hold fold markers + self.SetMarginType(2, stc.STC_MARGIN_SYMBOL) + self.SetMarginMask(2, stc.STC_MASK_FOLDERS) + self.SetMarginSensitive(2, True) + self.SetMarginWidth(2, 12) + + # and now set up the fold markers + self.MarkerDefine(stc.STC_MARKNUM_FOLDEREND, stc.STC_MARK_BOXPLUSCONNECTED, "white", "black") + self.MarkerDefine(stc.STC_MARKNUM_FOLDEROPENMID, stc.STC_MARK_BOXMINUSCONNECTED, "white", "black") + self.MarkerDefine(stc.STC_MARKNUM_FOLDERMIDTAIL, stc.STC_MARK_TCORNER, "white", "black") + self.MarkerDefine(stc.STC_MARKNUM_FOLDERTAIL, stc.STC_MARK_LCORNER, "white", "black") + self.MarkerDefine(stc.STC_MARKNUM_FOLDERSUB, stc.STC_MARK_VLINE, "white", "black") + self.MarkerDefine(stc.STC_MARKNUM_FOLDER, stc.STC_MARK_BOXPLUS, "white", "black") + self.MarkerDefine(stc.STC_MARKNUM_FOLDEROPEN, stc.STC_MARK_BOXMINUS, "white", "black") + + # Global default style + if wx.Platform == '__WXMSW__': + self.StyleSetSpec(stc.STC_STYLE_DEFAULT, + 'fore:#000000,back:#FFFFFF,face:Courier New,size:9') + else: + self.StyleSetSpec(stc.STC_STYLE_DEFAULT, + 'fore:#000000,back:#FFFFFF,face:Courier,size:12') + + # Clear styles and revert to default. + self.StyleClearAll() + + # Following style specs only indicate differences from default. + # The rest remains unchanged. + + # Line numbers in margin + self.StyleSetSpec(wx.stc.STC_STYLE_LINENUMBER,'fore:#000000,back:#99A9C2') + + # Highlighted brace + self.StyleSetSpec(wx.stc.STC_STYLE_BRACELIGHT,'fore:#00009D,back:#FFFF00') + # Unmatched brace + self.StyleSetSpec(wx.stc.STC_STYLE_BRACEBAD,'fore:#00009D,back:#FF0000') + # Indentation guide + self.StyleSetSpec(wx.stc.STC_STYLE_INDENTGUIDE, "fore:#CDCDCD") + + # Python styles + self.StyleSetSpec(wx.stc.STC_P_DEFAULT, 'fore:#000000') + # Comments + self.StyleSetSpec(wx.stc.STC_P_COMMENTLINE, 'fore:#008000,back:#F0FFF0') + self.StyleSetSpec(wx.stc.STC_P_COMMENTBLOCK, 'fore:#008000,back:#F0FFF0') + # Numbers + self.StyleSetSpec(wx.stc.STC_P_NUMBER, 'fore:#008080') + # Strings and characters + self.StyleSetSpec(wx.stc.STC_P_STRING, 'fore:#800080') + self.StyleSetSpec(wx.stc.STC_P_CHARACTER, 'fore:#800080') + # Keywords + self.StyleSetSpec(wx.stc.STC_P_WORD, 'fore:#000080,bold') + # Triple quotes + self.StyleSetSpec(wx.stc.STC_P_TRIPLE, 'fore:#800080,back:#FFFFEA') + self.StyleSetSpec(wx.stc.STC_P_TRIPLEDOUBLE, 'fore:#800080,back:#FFFFEA') + # Class names + self.StyleSetSpec(wx.stc.STC_P_CLASSNAME, 'fore:#0000FF,bold') + # Function names + self.StyleSetSpec(wx.stc.STC_P_DEFNAME, 'fore:#008080,bold') + # Operators + self.StyleSetSpec(wx.stc.STC_P_OPERATOR, 'fore:#800000,bold') + # Identifiers. I leave this as not bold because everything seems + # to be an identifier if it doesn't match the above criterae + self.StyleSetSpec(wx.stc.STC_P_IDENTIFIER, 'fore:#000000') + + # Caret color + self.SetCaretForeground("BLUE") + # Selection background + self.SetSelBackground(1, '#66CCFF') + + self.SetSelBackground(True, wx.SystemSettings_GetColour(wx.SYS_COLOUR_HIGHLIGHT)) + self.SetSelForeground(True, wx.SystemSettings_GetColour(wx.SYS_COLOUR_HIGHLIGHTTEXT)) + except ImportError: class DemoCodeViewer(wx.TextCtrl): @@ -299,7 +433,8 @@ class wxPythonDemo(wx.Frame): def __init__(self, parent, id, title): wx.Frame.__init__(self, parent, -1, title, size = (800, 600), - style=wx.DEFAULT_FRAME_STYLE|wx.NO_FULL_REPAINT_ON_RESIZE) + style=wx.DEFAULT_FRAME_STYLE|wx.NO_FULL_REPAINT_ON_RESIZE) + self.cwd = os.getcwd() self.curOverview = "" @@ -308,32 +443,50 @@ class wxPythonDemo(wx.Frame): icon = images.getMondrianIcon() self.SetIcon(icon) - if wx.Platform == '__WXMSW__': + if wx.Platform != '__WXMAC__': # setup a taskbar icon, and catch some events from it + icon = wx.IconFromBitmap( + images.getMondrianImage().Scale(16,16).ConvertToBitmap() ) self.tbicon = wx.TaskBarIcon() self.tbicon.SetIcon(icon, "wxPython Demo") - wx.EVT_TASKBAR_LEFT_DCLICK(self.tbicon, self.OnTaskBarActivate) - wx.EVT_TASKBAR_RIGHT_UP(self.tbicon, self.OnTaskBarMenu) - wx.EVT_MENU(self.tbicon, self.TBMENU_RESTORE, self.OnTaskBarActivate) - wx.EVT_MENU(self.tbicon, self.TBMENU_CLOSE, self.OnTaskBarClose) + self.tbicon.Bind(wx.EVT_TASKBAR_LEFT_DCLICK, self.OnTaskBarActivate) + self.tbicon.Bind(wx.EVT_TASKBAR_RIGHT_UP, self.OnTaskBarMenu) + self.tbicon.Bind(wx.EVT_MENU, self.OnTaskBarActivate, id=self.TBMENU_RESTORE) + self.tbicon.Bind(wx.EVT_MENU, self.OnTaskBarClose, id=self.TBMENU_CLOSE) wx.CallAfter(self.ShowTip) self.otherWin = None - wx.EVT_IDLE(self, self.OnIdle) - wx.EVT_CLOSE(self, self.OnCloseWindow) - wx.EVT_ICONIZE(self, self.OnIconfiy) - wx.EVT_MAXIMIZE(self, self.OnMaximize) + self.Bind(wx.EVT_IDLE, self.OnIdle) + self.Bind(wx.EVT_CLOSE, self.OnCloseWindow) + self.Bind(wx.EVT_ICONIZE, self.OnIconfiy) + self.Bind(wx.EVT_MAXIMIZE, self.OnMaximize) self.Centre(wx.BOTH) self.CreateStatusBar(1, wx.ST_SIZEGRIP) - splitter = wx.SplitterWindow(self, -1, style=wx.NO_3D|wx.SP_3D) - splitter2 = wx.SplitterWindow(splitter, -1, style=wx.NO_3D|wx.SP_3D) + splitter = wx.SplitterWindow(self, -1, style=wx.CLIP_CHILDREN) + splitter2 = wx.SplitterWindow(splitter, -1, style=wx.CLIP_CHILDREN) + + # Set up a log on the View Log Notebook page + self.log = wx.TextCtrl(splitter2, -1, + style = wx.TE_MULTILINE|wx.TE_READONLY|wx.HSCROLL) + + # Set the wxWindows log target to be this textctrl + #wx.Log_SetActiveTarget(wx.LogTextCtrl(self.log)) + + # But instead of the above we want to show how to use our own wx.Log class + wx.Log_SetActiveTarget(MyLog(self.log)) + + # for serious debugging + #wx.Log_SetActiveTarget(wx.LogStderr()) + #wx.Log_SetTraceMask(wx.TraceMessages) + + def EmptyHandler(evt): pass - wx.EVT_ERASE_BACKGROUND(splitter, EmptyHandler) - wx.EVT_ERASE_BACKGROUND(splitter2, EmptyHandler) + #splitter.Bind(wx.EVT_ERASE_BACKGROUND, EmptyHandler) + #splitter2.Bind(wx.EVT_ERASE_BACKGROUND, EmptyHandler) # Prevent TreeCtrl from displaying all items after destruction when True self.dying = False @@ -341,10 +494,15 @@ class wxPythonDemo(wx.Frame): # Make a File menu self.mainmenu = wx.MenuBar() menu = wx.Menu() - exitID = wx.NewId() - menu.Append(exitID, 'E&xit\tAlt-X', 'Get the heck outta here!') - wx.EVT_MENU(self, exitID, self.OnFileExit) - wx.App_SetMacExitMenuItemId(exitID) + item = menu.Append(-1, '&Redirect Output', + 'Redirect print statements to a window', + wx.ITEM_CHECK) + self.Bind(wx.EVT_MENU, self.OnToggleRedirect, item) + + item = menu.Append(-1, 'E&xit\tAlt-X', 'Get the heck outta here!') + self.Bind(wx.EVT_MENU, self.OnFileExit, item) + wx.App_SetMacExitMenuItemId(item.GetId()) + self.mainmenu.Append(menu, '&File') # Make a Demo menu @@ -352,9 +510,8 @@ class wxPythonDemo(wx.Frame): for item in _treeList: submenu = wx.Menu() for childItem in item[1]: - mID = wx.NewId() - submenu.Append(mID, childItem) - wx.EVT_MENU(self, mID, self.OnDemoMenu) + mi = submenu.Append(-1, childItem) + self.Bind(wx.EVT_MENU, self.OnDemoMenu, mi) menu.AppendMenu(wx.NewId(), item[0], submenu) self.mainmenu.Append(menu, '&Demo') @@ -364,17 +521,17 @@ class wxPythonDemo(wx.Frame): findID = wx.NewId() findnextID = wx.NewId() menu = wx.Menu() - menu.Append(findID, '&Find\tCtrl-F', 'Find in the Demo Code') - menu.Append(findnextID, 'Find &Next\tF3', 'Find Next') + findItem = menu.Append(-1, '&Find\tCtrl-F', 'Find in the Demo Code') + findnextItem = menu.Append(-1, 'Find &Next\tF3', 'Find Next') menu.AppendSeparator() - menu.Append(helpID, '&About\tCtrl-H', 'wxPython RULES!!!') - wx.App_SetMacAboutMenuItemId(helpID) - wx.EVT_MENU(self, helpID, self.OnHelpAbout) - wx.EVT_MENU(self, findID, self.OnHelpFind) - wx.EVT_MENU(self, findnextID, self.OnFindNext) - wx.EVT_COMMAND_FIND(self, -1, self.OnFind) - wx.EVT_COMMAND_FIND_NEXT(self, -1, self.OnFind) - wx.EVT_COMMAND_FIND_CLOSE(self, -1 , self.OnFindClose) + helpItem = menu.Append(-1, '&About\tCtrl-H', 'wxPython RULES!!!') + wx.App_SetMacAboutMenuItemId(helpItem.GetId()) + self.Bind(wx.EVT_MENU, self.OnHelpAbout, helpItem) + self.Bind(wx.EVT_MENU, self.OnHelpFind, findItem) + self.Bind(wx.EVT_MENU, self.OnFindNext, findnextItem) + self.Bind(wx.EVT_COMMAND_FIND, self.OnFind) + self.Bind(wx.EVT_COMMAND_FIND_NEXT, self.OnFind) + self.Bind(wx.EVT_COMMAND_FIND_CLOSE, self.OnFindClose) self.mainmenu.Append(menu, '&Help') self.SetMenuBar(self.mainmenu) @@ -394,9 +551,8 @@ class wxPythonDemo(wx.Frame): # Create a TreeCtrl tID = wx.NewId() self.treeMap = {} - self.tree = wx.TreeCtrl(splitter, tID, - style=wx.TR_HAS_BUTTONS | - wx.TR_HAS_VARIABLE_ROW_HEIGHT + self.tree = wx.TreeCtrl(splitter, tID, style = + wx.TR_DEFAULT_STYLE #| wx.TR_HAS_VARIABLE_ROW_HEIGHT ) root = self.tree.AddRoot("wxPython Overview") @@ -410,10 +566,10 @@ class wxPythonDemo(wx.Frame): self.tree.Expand(root) self.tree.Expand(firstChild) - wx.EVT_TREE_ITEM_EXPANDED (self.tree, tID, self.OnItemExpanded) - wx.EVT_TREE_ITEM_COLLAPSED (self.tree, tID, self.OnItemCollapsed) - wx.EVT_TREE_SEL_CHANGED (self.tree, tID, self.OnSelChanged) - wx.EVT_LEFT_DOWN (self.tree, self.OnTreeLeftDown) + self.tree.Bind(wx.EVT_TREE_ITEM_EXPANDED, self.OnItemExpanded, id=tID) + self.tree.Bind(wx.EVT_TREE_ITEM_COLLAPSED, self.OnItemCollapsed, id=tID) + self.tree.Bind(wx.EVT_TREE_SEL_CHANGED, self.OnSelChanged, id=tID) + self.tree.Bind(wx.EVT_LEFT_DOWN, self.OnTreeLeftDown) # Create a Notebook self.nb = wx.Notebook(splitter2, -1, style=wx.CLIP_CHILDREN) @@ -434,8 +590,8 @@ class wxPythonDemo(wx.Frame): def OnOvrSize(evt, ovr=self.ovr): ovr.SetSize(evt.GetSize()) - wx.EVT_SIZE(panel, OnOvrSize) - wx.EVT_ERASE_BACKGROUND(panel, EmptyHandler) + panel.Bind(wx.EVT_SIZE, OnOvrSize) + panel.Bind(wx.EVT_ERASE_BACKGROUND, EmptyHandler) self.SetOverview(self.overviewText, overview) @@ -444,34 +600,26 @@ class wxPythonDemo(wx.Frame): # Set up a notebook page for viewing the source code of each sample self.txt = DemoCodeViewer(self.nb, -1) self.nb.AddPage(self.txt, "Demo Code") - self.GetDemoFile('Main.py') - - - # Set up a log on the View Log Notebook page - self.log = wx.TextCtrl(splitter2, -1, - style = wx.TE_MULTILINE|wx.TE_READONLY|wx.HSCROLL) - - # Set the wxWindows log target to be this textctrl - #wx.Log_SetActiveTarget(wx.LogTextCtrl(self.log)) - - # But instead of the above we want to show how to use our own wx.Log class - wx.Log_SetActiveTarget(MyLog(self.log)) - - # for serious debugging - #wx.Log_SetActiveTarget(wx.LogStderr()) - #wx.Log_SetTraceMask(wx.TraceMessages) - - self.Show(True) + self.LoadDemoSource('Main.py') # add the windows to the splitter and split it. - splitter2.SplitHorizontally(self.nb, self.log, 450) + splitter2.SplitHorizontally(self.nb, self.log, -120) splitter.SplitVertically(self.tree, splitter2, 180) splitter.SetMinimumPaneSize(20) splitter2.SetMinimumPaneSize(20) + # Make the splitter on the right expand the top window when resized + def SplitterOnSize(evt): + splitter = evt.GetEventObject() + sz = splitter.GetSize() + splitter.SetSashPosition(sz.height - 120, False) + evt.Skip() + + splitter2.Bind(wx.EVT_SIZE, SplitterOnSize) + # select initial items self.nb.SetSelection(0) @@ -487,7 +635,7 @@ class wxPythonDemo(wx.Frame): self.tree.EnsureVisible(selectedDemo) - wx.LogMessage('window handle: %s' % self.GetHandle()) +## wx.LogMessage('window handle: %s' % self.GetHandle()) #--------------------------------------------- @@ -544,9 +692,8 @@ class wxPythonDemo(wx.Frame): self.nb.DeletePage(2) if itemText == self.overviewText: - self.GetDemoFile('Main.py') + self.LoadDemoSource('Main.py') self.SetOverview(self.overviewText, overview) - self.nb.Refresh(); self.window = None else: @@ -554,33 +701,33 @@ class wxPythonDemo(wx.Frame): wx.BeginBusyCursor() wx.LogMessage("Running demo %s.py..." % itemText) try: - self.GetDemoFile(itemText + '.py') + self.LoadDemoSource(itemText + '.py') + + if (sys.modules.has_key(itemText)): + reload(sys.modules[itemText]) + module = __import__(itemText, globals()) self.SetOverview(itemText + " Overview", module.overview) finally: wx.EndBusyCursor() self.tree.Refresh() - # in case runTest is modal, make sure things look right... - self.nb.Refresh(); - wx.SafeYield() - self.window = module.runTest(self, self.nb, self) ### if self.window is not None: self.nb.AddPage(self.window, 'Demo') self.nb.SetSelection(2) - self.nb.Refresh() # without this wxMac has troubles showing the just added page else: self.ovr.SetPage("") self.txt.Clear() self.window = None + self.tree.SetFocus() #--------------------------------------------- # Get the Demo files - def GetDemoFile(self, filename): + def LoadDemoSource(self, filename): self.txt.Clear() try: self.txt.SetValue(open(filename).read()) @@ -604,6 +751,15 @@ class wxPythonDemo(wx.Frame): def OnFileExit(self, *event): self.Close() + def OnToggleRedirect(self, event): + app = wx.GetApp() + if event.Checked(): + app.RedirectStdio() + print "Print statements and other standard output will now be directed to this window." + else: + app.RestoreStdio() + print "Print statements and other standard output will now be sent to the usual location." + def OnHelpAbout(self, event): from About import MyAboutBox about = MyAboutBox(self) @@ -661,8 +817,6 @@ class wxPythonDemo(wx.Frame): self.dying = True self.window = None self.mainmenu = None - if hasattr(self, "tbicon"): - del self.tbicon self.Destroy() @@ -749,12 +903,12 @@ class MySplashScreen(wx.SplashScreen): def __init__(self): bmp = wx.Image(opj("bitmaps/splash.gif")).ConvertToBitmap() wx.SplashScreen.__init__(self, bmp, - wx.SPLASH_CENTRE_ON_SCREEN|wx.SPLASH_TIMEOUT, - 4000, None, -1, - style = wx.SIMPLE_BORDER|wx.FRAME_NO_TASKBAR|wx.STAY_ON_TOP) - wx.EVT_CLOSE(self, self.OnClose) + wx.SPLASH_CENTRE_ON_SCREEN | wx.SPLASH_TIMEOUT, + 3000, None, -1) + self.Bind(wx.EVT_CLOSE, self.OnClose) def OnClose(self, evt): + self.Hide() frame = wxPythonDemo(None, -1, "wxPython: (A Demonstration)") frame.Show() evt.Skip() # Make sure the default handler runs too... @@ -767,13 +921,17 @@ class MyApp(wx.App): the main frame when it is time to do so. """ - #import locale - #self.locale = wx.Locale(wx.LANGUAGE_FRENCH) - #locale.setlocale(locale.LC_ALL, 'fr') - wx.InitAllImageHandlers() + + # Normally when using a SplashScreen you would create it, show + # it and then continue on with the applicaiton's + # initialization, finally creating and showing the main + # application window(s). In this case we have nothing else to + # do so we'll delay showing the main frame until later (see + # OnClose above) so the users can see the SplashScrren effect. splash = MySplashScreen() splash.Show() + return True @@ -786,7 +944,7 @@ def main(): os.chdir(demoPath) except: pass - app = MyApp(wx.Platform == "__WXMAC__") + app = MyApp(0) ##wx.Platform == "__WXMAC__") app.MainLoop() @@ -808,7 +966,7 @@ platform GUI library, which is written in C++.
Like Python and wxWindows, wxPython is Open Source which means that it is free for anyone to use and the source code is available for anyone to look at and modify. Or anyone can contribute -fixes or enhnacments to the project. +fixes or enhancements to the project.
wxPython is a cross-platform toolkit. This means that the same program will run on multiple platforms without modification.