X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/3628e0888696a4a1d306e621d477a89c43898f05..61940a7061d0b5d5122b1e1e939cfa2d72596999:/wxPython/demo/Main.py diff --git a/wxPython/demo/Main.py b/wxPython/demo/Main.py index 52412f1e90..bd75b35f5b 100644 --- a/wxPython/demo/Main.py +++ b/wxPython/demo/Main.py @@ -18,6 +18,10 @@ import wx.html import images +# For debugging +##wx.Trap(); +##print os.getpid(); raw_input("Press a key...") + #--------------------------------------------------------------------------- @@ -26,6 +30,13 @@ _treeList = [ # new stuff ('Recent Additions', [ 'wxVListBox', + 'wxListbook', + 'wxMaskedNumCtrl', + 'FloatCanvas', + 'wxXmlResourceSubclass', + 'wxGridBagSizer', + 'Cursor', + 'PyPlot', ]), # managed windows == things with a (optional) caption you can close @@ -70,9 +81,9 @@ _treeList = [ 'wxChoice', 'wxComboBox', 'wxGauge', - 'wxGenericDirCtrl', 'wxGrid', 'wxGrid_MegaExample', + 'wxListbook', 'wxListBox', 'wxListCtrl', 'wxListCtrl_virtual', @@ -97,40 +108,48 @@ _treeList = [ 'wxValidator', ]), - # controls coming from other librairies + ('Custom Controls', [ + 'AnalogClockWindow', + 'ColourSelect', + 'GenericButtons', + 'wxEditor', + 'wxGenericDirCtrl', + 'wxLEDNumberCtrl', + 'wxMultiSash', + 'wxPopupControl', + 'wxPyColourChooser', + 'wxTreeListCtrl', + ]), + + # controls coming from other libraries ('More Windows/Controls', [ #'wxFloatBar', deprecated #'wxMVCTree', deprecated #'wxRightTextCtrl', deprecated as we have wxTE_RIGHT now. - 'AnalogClockWindow', - 'ColourSelect', 'ContextHelp', 'FancyText', + 'FloatCanvas', 'FileBrowseButton', - 'GenericButtons', 'MaskedEditControls', 'PyShell', 'PyCrust', + 'PyPlot', 'SplitTree', 'TablePrint', 'Throbber', 'wxCalendar', 'wxCalendarCtrl', - 'wxPyColourChooser', 'wxDynamicSashWindow', 'wxEditableListBox', - 'wxEditor', 'wxHtmlWindow', 'wxIEHtmlWin', 'wxIntCtrl', - 'wxLEDNumberCtrl', 'wxMimeTypesManager', - 'wxMultiSash', - 'wxPopupControl', + 'wxMaskedNumCtrl', + 'wxScrolledPanel', 'wxStyledTextCtrl_1', 'wxStyledTextCtrl_2', 'wxTimeCtrl', - 'wxTreeListCtrl', 'wxVListBox', ]), @@ -140,10 +159,12 @@ _treeList = [ 'Layoutf', 'RowColSizer', 'Sizers', + 'wxGridBagSizer', 'wxLayoutConstraints', 'wxScrolledPanel', 'wxXmlResource', 'wxXmlResourceHandler', + 'wxXmlResourceSubclass', ]), # ditto @@ -167,6 +188,7 @@ _treeList = [ # Images ('Using Images', [ + 'Cursor', 'Throbber', 'wxArtProvider', 'wxDragImage', @@ -197,7 +219,7 @@ _treeList = [ 'ActiveXWrapper_Acrobat', 'ActiveXWrapper_IE', 'wxGLCanvas', - 'wxPlotCanvas', + #'wxPlotCanvas', # deprecated, use PyPlot ]), @@ -209,6 +231,7 @@ _treeList = [ #--------------------------------------------------------------------------- +# Show how to derive a custom wxLog class class MyLog(wx.PyLog): def __init__(self, textCtrl, logTime=0): @@ -232,6 +255,7 @@ 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 # if there is an error, such as the stc module not being present. +# try: ##raise ImportError @@ -240,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): @@ -272,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): @@ -295,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 = "" @@ -304,32 +439,34 @@ 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) + 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 @@ -339,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') @@ -350,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') @@ -365,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) @@ -405,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) @@ -429,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) @@ -439,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 @@ -456,17 +593,24 @@ 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, 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 wind 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) @@ -539,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 @@ -549,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: @@ -575,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()) @@ -744,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)") @@ -762,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 @@ -781,7 +932,7 @@ def main(): os.chdir(demoPath) except: pass - app = MyApp(wx.Platform == "__WXMAC__") + app = MyApp(0) #wx.Platform == "__WXMAC__") app.MainLoop() @@ -803,7 +954,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.