X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/d14a1e28567de23c586bc80017073d0c39f8d18f..61940a7061d0b5d5122b1e1e939cfa2d72596999:/wxPython/demo/Main.py diff --git a/wxPython/demo/Main.py b/wxPython/demo/Main.py index ef214a2a53..bd75b35f5b 100644 --- a/wxPython/demo/Main.py +++ b/wxPython/demo/Main.py @@ -23,13 +23,6 @@ import images ##print os.getpid(); raw_input("Press a key...") -# Use Python's bool constants if available, make aliases if not -try: - True -except NameError: - __builtins__.True = 1==1 - __builtins__.False = 1==0 - #--------------------------------------------------------------------------- @@ -42,6 +35,8 @@ _treeList = [ 'FloatCanvas', 'wxXmlResourceSubclass', 'wxGridBagSizer', + 'Cursor', + 'PyPlot', ]), # managed windows == things with a (optional) caption you can close @@ -138,6 +133,7 @@ _treeList = [ 'MaskedEditControls', 'PyShell', 'PyCrust', + 'PyPlot', 'SplitTree', 'TablePrint', 'Throbber', @@ -150,6 +146,7 @@ _treeList = [ 'wxIntCtrl', 'wxMimeTypesManager', 'wxMaskedNumCtrl', + 'wxScrolledPanel', 'wxStyledTextCtrl_1', 'wxStyledTextCtrl_2', 'wxTimeCtrl', @@ -191,6 +188,7 @@ _treeList = [ # Images ('Using Images', [ + 'Cursor', 'Throbber', 'wxArtProvider', 'wxDragImage', @@ -221,7 +219,7 @@ _treeList = [ 'ActiveXWrapper_Acrobat', 'ActiveXWrapper_IE', 'wxGLCanvas', - 'wxPlotCanvas', + #'wxPlotCanvas', # deprecated, use PyPlot ]), @@ -266,9 +264,7 @@ try: 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)) + self.SetUpEditor() # Some methods to make it compatible with how the wxTextCtrl is used def SetValue(self, value): @@ -298,6 +294,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): @@ -321,7 +430,7 @@ 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 = "" @@ -330,22 +439,24 @@ 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) @@ -354,8 +465,8 @@ class wxPythonDemo(wx.Frame): splitter2 = wx.SplitterWindow(splitter, -1) 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 @@ -365,7 +476,7 @@ class wxPythonDemo(wx.Frame): 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) + self.Bind(wx.EVT_MENU, self.OnFileExit, id=exitID) wx.App_SetMacExitMenuItemId(exitID) self.mainmenu.Append(menu, '&File') @@ -376,7 +487,7 @@ class wxPythonDemo(wx.Frame): for childItem in item[1]: mID = wx.NewId() submenu.Append(mID, childItem) - wx.EVT_MENU(self, mID, self.OnDemoMenu) + self.Bind(wx.EVT_MENU, self.OnDemoMenu, id=mID) menu.AppendMenu(wx.NewId(), item[0], submenu) self.mainmenu.Append(menu, '&Demo') @@ -391,12 +502,12 @@ class wxPythonDemo(wx.Frame): 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) + self.Bind(wx.EVT_MENU, self.OnHelpAbout, id=helpID) + self.Bind(wx.EVT_MENU, self.OnHelpFind, id=findID) + self.Bind(wx.EVT_MENU, self.OnFindNext, id=findnextID) + 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) @@ -431,10 +542,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) @@ -455,8 +566,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) @@ -465,7 +576,7 @@ 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') + self.LoadDemoSource('Main.py') # Set up a log on the View Log Notebook page @@ -482,8 +593,6 @@ class wxPythonDemo(wx.Frame): #wx.Log_SetActiveTarget(wx.LogStderr()) #wx.Log_SetTraceMask(wx.TraceMessages) - self.Show(True) - # add the windows to the splitter and split it. splitter2.SplitHorizontally(self.nb, self.log, -120) @@ -499,7 +608,8 @@ class wxPythonDemo(wx.Frame): sz = splitter.GetSize() splitter.SetSashPosition(sz.height - 120, False) evt.Skip() - wx.EVT_SIZE(splitter2, SplitterOnSize) + + splitter2.Bind(wx.EVT_SIZE, SplitterOnSize) # select initial items @@ -573,7 +683,7 @@ 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 @@ -583,7 +693,11 @@ 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: @@ -609,7 +723,7 @@ class wxPythonDemo(wx.Frame): #--------------------------------------------- # Get the Demo files - def GetDemoFile(self, filename): + def LoadDemoSource(self, filename): self.txt.Clear() try: self.txt.SetValue(open(filename).read()) @@ -778,10 +892,9 @@ 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): frame = wxPythonDemo(None, -1, "wxPython: (A Demonstration)") @@ -796,13 +909,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