#!/bin/env python #---------------------------------------------------------------------------- # Name: Main.py # Purpose: Testing lots of stuff, controls, window types, etc. # # Author: Robin Dunn & Gary Dumer # # Created: # RCS-ID: $Id$ # Copyright: (c) 1999 by Total Control Software # Licence: wxWindows license #---------------------------------------------------------------------------- import sys, os from wxPython.wx import * #--------------------------------------------------------------------------- _treeList = [ ('Managed Windows', ['wxFrame', 'wxDialog', 'wxMiniFrame']), ('Miscellaneous Windows', ['wxGrid', 'wxSashWindow', 'wxScrolledWindow', 'wxSplitterWindow', 'wxStatusBar', 'wxToolBar', 'wxNotebook', 'wxHtmlWindow']), ('Common Dialogs', ['wxColourDialog', 'wxDirDialog', 'wxFileDialog', 'wxSingleChoiceDialog', 'wxTextEntryDialog', 'wxFontDialog', 'wxPageSetupDialog', 'wxPrintDialog', 'wxMessageDialog', 'wxProgressDialog']), ('Controls', ['wxButton', 'wxCheckBox', 'wxCheckListBox', 'wxChoice', 'wxComboBox', 'wxGauge', 'wxListBox', 'wxListCtrl', 'wxTextCtrl', 'wxTreeCtrl', 'wxSpinButton', 'wxStaticText', 'wxStaticBitmap', 'wxRadioBox', 'wxSlider']), ('Window Layout', ['wxLayoutConstraints', 'Sizers']), ('Miscellaneous', ['wxTimer', 'wxGLCanvas', 'DialogUnits', 'wxImage', 'PrintFramework', 'wxOGL']), ('wxPython Library', ['Sizers', 'Layoutf', 'wxScrolledMessageDialog', 'wxMultipleChoiceDialog', 'wxPlotCanvas']), ('Cool Contribs', ['pyTree', 'hangman', 'SlashDot', 'XMLtreeview']), ] #--------------------------------------------------------------------------- class wxPythonDemo(wxFrame): def __init__(self, parent, id, title): wxFrame.__init__(self, parent, -1, title, wxDefaultPosition, wxSize(700, 550)) if wxPlatform == '__WXMSW__': self.icon = wxIcon('bitmaps/mondrian.ico', wxBITMAP_TYPE_ICO) self.SetIcon(self.icon) self.otherWin = None EVT_IDLE(self, self.OnIdle) self.Centre(wxBOTH) self.CreateStatusBar(1, wxST_SIZEGRIP) splitter = wxSplitterWindow(self, -1) splitter2 = wxSplitterWindow(splitter, -1) # Prevent TreeCtrl from displaying all items after destruction self.dying = false # Make a File menu self.mainmenu = wxMenuBar() menu = wxMenu() mID = wxNewId() menu.Append(mID, 'E&xit', 'Get the heck outta here!') EVT_MENU(self, mID, self.OnFileExit) self.mainmenu.Append(menu, '&File') # Make a Demo menu menu = wxMenu() for item in _treeList: submenu = wxMenu() for childItem in item[1]: mID = wxNewId() submenu.Append(mID, childItem) EVT_MENU(self, mID, self.OnDemoMenu) menu.AppendMenu(wxNewId(), item[0], submenu) self.mainmenu.Append(menu, '&Demo') # Make a Help menu mID = wxNewId() menu = wxMenu() menu.Append(mID, '&About', 'wxPython RULES!!!') EVT_MENU(self, mID, self.OnHelpAbout) self.mainmenu.Append(menu, '&Help') self.SetMenuBar(self.mainmenu) # Create a TreeCtrl tID = wxNewId() self.treeMap = {} self.tree = wxTreeCtrl(splitter, tID) root = self.tree.AddRoot("Overview") for item in _treeList: child = self.tree.AppendItem(root, item[0]) for childItem in item[1]: theDemo = self.tree.AppendItem(child, childItem) self.treeMap[childItem] = theDemo self.tree.Expand(root) EVT_TREE_ITEM_EXPANDED (self.tree, tID, self.OnItemExpanded) EVT_TREE_ITEM_COLLAPSED (self.tree, tID, self.OnItemCollapsed) EVT_TREE_SEL_CHANGED (self.tree, tID, self.OnSelChanged) # Create a Notebook self.nb = wxNotebook(splitter2, -1) # Set up a TextCtrl on the Overview Notebook page self.ovr = wxTextCtrl(self.nb, -1, style = wxTE_MULTILINE|wxTE_READONLY) self.nb.AddPage(self.ovr, "Overview") # Set up a TextCtrl on the Demo Code Notebook page self.txt = wxTextCtrl(self.nb, -1, style = wxTE_MULTILINE|wxTE_READONLY|wxHSCROLL) self.txt.SetFont(wxFont(9, wxMODERN, wxNORMAL, wxNORMAL, false)) self.nb.AddPage(self.txt, "Demo Code") # Set up a log on the View Log Notebook page self.log = wxTextCtrl(splitter2, -1, style = wxTE_MULTILINE|wxTE_READONLY|wxHSCROLL) (w, self.charHeight) = self.log.GetTextExtent('X') #self.WriteText('wxPython Demo Log:\n') # add the windows to the splitter and split it. splitter.SplitVertically(self.tree, splitter2) splitter.SetSashPosition(180, true) splitter.SetMinimumPaneSize(20) splitter2.SplitHorizontally(self.nb, self.log) splitter2.SetSashPosition(360, true) splitter2.SetMinimumPaneSize(20) # make our log window be stdout #sys.stdout = self # select initial items self.nb.SetSelection(0) self.tree.SelectItem(root) if len(sys.argv) == 2: try: selectedDemo = self.treeMap[sys.argv[1]] except: selectedDemo = None if selectedDemo: self.tree.SelectItem(selectedDemo) self.tree.EnsureVisible(selectedDemo) #--------------------------------------------- def WriteText(self, text): self.log.WriteText(text) w, h = self.log.GetClientSizeTuple() numLines = h/self.charHeight x, y = self.log.PositionToXY(self.log.GetLastPosition()) self.log.ShowPosition(self.log.XYToPosition(x, y-numLines)) ##self.log.ShowPosition(self.log.GetLastPosition()) self.log.SetInsertionPointEnd() def write(self, txt): self.WriteText(txt) #--------------------------------------------- def OnItemExpanded(self, event): item = event.GetItem() self.log.WriteText("OnItemExpanded: %s\n" % self.tree.GetItemText(item)) #--------------------------------------------- def OnItemCollapsed(self, event): item = event.GetItem() self.log.WriteText("OnItemCollapsed: %s\n" % self.tree.GetItemText(item)) #--------------------------------------------- def OnSelChanged(self, event): if self.dying: return if self.nb.GetPageCount() == 3: if self.nb.GetSelection() == 2: self.nb.SetSelection(0) self.nb.DeletePage(2) item = event.GetItem() itemText = self.tree.GetItemText(item) if itemText == 'Overview': self.GetDemoFile('Main.py') self.SetOverview('Overview', overview) #self.nb.ResizeChildren(); self.nb.Refresh(); #wxYield() self.window = None else: if os.path.exists(itemText + '.py'): self.GetDemoFile(itemText + '.py') module = __import__(itemText, globals()) self.SetOverview(itemText, module.overview) # in case runTest is modal, make sure things look right... self.nb.Refresh(); wxYield() self.window = module.runTest(self, self.nb, self) if self.window: self.nb.AddPage(self.window, 'Demo') self.nb.SetSelection(2) self.nb.ResizeChildren(); else: self.ovr.Clear() self.txt.Clear() self.window = None #--------------------------------------------- # Get the Demo files def GetDemoFile(self, filename): self.txt.Clear() #if not self.txt.LoadFile(filename): # self.txt.WriteText("Cannot open %s file." % filename) try: self.txt.SetValue(open(filename).read()) except IOError: self.txt.WriteText("Cannot open %s file." % filename) self.txt.SetInsertionPoint(0) self.txt.ShowPosition(0) #--------------------------------------------- def SetOverview(self, name, text): self.ovr.Clear() self.ovr.WriteText(text) self.nb.SetPageText(0, name) self.ovr.SetInsertionPoint(0) self.ovr.ShowPosition(0) #--------------------------------------------- # Menu methods def OnFileExit(self, event): self.Close() def OnHelpAbout(self, event): #about = wxMessageDialog(self, # "wxPython is a Python extension module that\n" # "encapsulates the wxWindows GUI classes.\n\n" # "This demo shows off some of the capabilities\n" # "of wxPython.\n\n" # " Developed by Robin Dunn", # "About wxPython", wxOK) about = MyAboutBox(self) about.ShowModal() about.Destroy() #--------------------------------------------- def OnCloseWindow(self, event): self.dying = true self.window = None self.Destroy() #--------------------------------------------- def OnIdle(self, event): if self.otherWin: self.otherWin.Raise() self.window = self.otherWin self.otherWin = None #--------------------------------------------- def OnDemoMenu(self, event): print event.GetId(), self.mainmenu.GetLabel(event.GetId()) try: selectedDemo = self.treeMap[self.mainmenu.GetLabel(event.GetId())] except: selectedDemo = None if selectedDemo: self.tree.SelectItem(selectedDemo) self.tree.EnsureVisible(selectedDemo) #--------------------------------------------------------------------------- #--------------------------------------------------------------------------- class MyAboutBox(wxDialog): text = '''
wxPython %s |
wxPython is a Python extension module that encapsulates the wxWindows GUI classes.
This demo shows off some of the capabilities of wxPython. Select items from the menu or tree control, sit back and enjoy. Be sure to take a peek at the source code for each demo item so you can learn how to use the classes yourself.
wxPython is brought to you by Robin Dunn and
Total Control Software, copyright 1999.
Please see license.txt for licensing information.