import images
+# For debugging
+##wx.Trap();
+##print os.getpid(); raw_input("Press a key...")
+
#---------------------------------------------------------------------------
# new stuff
('Recent Additions', [
'wxVListBox',
+ 'wxListbook',
+ 'wxMaskedNumCtrl',
+ 'FloatCanvas',
+ 'wxXmlResourceSubclass',
+ 'wxGridBagSizer',
+ 'Cursor',
+ 'PyPlot',
]),
# managed windows == things with a (optional) caption you can close
'wxChoice',
'wxComboBox',
'wxGauge',
- 'wxGenericDirCtrl',
'wxGrid',
'wxGrid_MegaExample',
+ 'wxListbook',
'wxListBox',
'wxListCtrl',
'wxListCtrl_virtual',
'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',
]),
'Layoutf',
'RowColSizer',
'Sizers',
+ 'wxGridBagSizer',
'wxLayoutConstraints',
'wxScrolledPanel',
'wxXmlResource',
'wxXmlResourceHandler',
+ 'wxXmlResourceSubclass',
]),
# ditto
# Images
('Using Images', [
+ 'Cursor',
'Throbber',
'wxArtProvider',
'wxDragImage',
'ActiveXWrapper_Acrobat',
'ActiveXWrapper_IE',
'wxGLCanvas',
- 'wxPlotCanvas',
+ #'wxPlotCanvas', # deprecated, use PyPlot
]),
#---------------------------------------------------------------------------
+# Show how to derive a custom wxLog class
class MyLog(wx.PyLog):
def __init__(self, textCtrl, logTime=0):
# 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
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):
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):
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 = ""
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
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')
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')
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)
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)
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)
# 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
#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)
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
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:
#---------------------------------------------
# Get the Demo files
- def GetDemoFile(self, filename):
+ def LoadDemoSource(self, filename):
self.txt.Clear()
try:
self.txt.SetValue(open(filename).read())
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)")
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
os.chdir(demoPath)
except:
pass
- app = MyApp(wx.Platform == "__WXMAC__")
+ app = MyApp(0) #wx.Platform == "__WXMAC__")
app.MainLoop()
<p> Like Python and wxWindows, wxPython is <b>Open Source</b> 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.
<p> wxPython is a <b>cross-platform</b> toolkit. This means that the
same program will run on multiple platforms without modification.