1999-04-29 23:29:54 -04:00
#!/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 *
1999-11-20 16:15:12 -05:00
from wxPython . lib . splashscreen import SplashScreen
1999-04-29 23:29:54 -04:00
#---------------------------------------------------------------------------
1999-10-16 02:08:16 -04:00
_useSplitter = true
_useNestedSplitter = true
1999-04-29 23:29:54 -04:00
_treeList = [
1999-11-25 02:08:14 -05:00
( ' New since last release ' , [ ' wxMVCTree ' , ' wxVTKRenderWindow ' ,
1999-12-23 15:05:08 -05:00
' FileBrowseButton ' , ' GenericButtons ' ,
1999-12-31 03:29:02 -05:00
' wxMask ' , ' wxEditor ' ] ) ,
1999-11-19 00:34:40 -05:00
1999-04-29 23:29:54 -04:00
( ' Managed Windows ' , [ ' wxFrame ' , ' wxDialog ' , ' wxMiniFrame ' ] ) ,
1999-11-06 03:30:23 -05:00
( ' Non-Managed Windows ' , [ ' wxGrid ' , ' wxSashWindow ' ,
1999-04-29 23:29:54 -04:00
' wxScrolledWindow ' , ' wxSplitterWindow ' ,
1999-12-23 15:05:08 -05:00
' wxStatusBar ' , ' wxNotebook ' ,
1999-09-13 15:31:50 -04:00
' wxHtmlWindow ' ] ) ,
1999-04-29 23:29:54 -04:00
( ' Common Dialogs ' , [ ' wxColourDialog ' , ' wxDirDialog ' , ' wxFileDialog ' ,
' wxSingleChoiceDialog ' , ' wxTextEntryDialog ' ,
' wxFontDialog ' , ' wxPageSetupDialog ' , ' wxPrintDialog ' ,
1999-06-22 03:03:29 -04:00
' wxMessageDialog ' , ' wxProgressDialog ' ] ) ,
1999-04-29 23:29:54 -04:00
( ' Controls ' , [ ' wxButton ' , ' wxCheckBox ' , ' wxCheckListBox ' , ' wxChoice ' ,
' wxComboBox ' , ' wxGauge ' , ' wxListBox ' , ' wxListCtrl ' , ' wxTextCtrl ' ,
' wxTreeCtrl ' , ' wxSpinButton ' , ' wxStaticText ' , ' wxStaticBitmap ' ,
1999-12-23 15:05:08 -05:00
' wxRadioBox ' , ' wxSlider ' , ' wxToolBar ' , #'wxToggleButton'
1999-12-11 02:59:23 -05:00
] ) ,
1999-04-29 23:29:54 -04:00
1999-09-30 03:11:20 -04:00
( ' Window Layout ' , [ ' wxLayoutConstraints ' , ' Sizers ' , ' OldSizers ' ] ) ,
1999-04-29 23:29:54 -04:00
1999-11-06 03:30:23 -05:00
( ' Miscellaneous ' , [ ' DragAndDrop ' , ' CustomDragAndDrop ' , ' FontEnumerator ' ,
' wxTimer ' , ' wxValidator ' , ' wxGLCanvas ' , ' DialogUnits ' ,
1999-12-23 15:05:08 -05:00
' wxImage ' , ' wxMask ' , ' PrintFramework ' , ' wxOGL ' ,
' PythonEvents ' , ' Threads ' ] ) ,
1999-04-29 23:29:54 -04:00
1999-11-10 17:47:12 -05:00
( ' wxPython Library ' , [ ' Layoutf ' , ' wxScrolledMessageDialog ' ,
1999-10-06 02:22:25 -04:00
' wxMultipleChoiceDialog ' , ' wxPlotCanvas ' , ' wxFloatBar ' ,
1999-11-25 02:08:14 -05:00
' PyShell ' , ' wxCalendar ' , ' wxMVCTree ' , ' wxVTKRenderWindow ' ,
1999-12-31 03:29:02 -05:00
' FileBrowseButton ' , ' GenericButtons ' , ' wxEditor ' ] ) ,
1999-04-29 23:29:54 -04:00
1999-07-31 03:56:15 -04:00
( ' Cool Contribs ' , [ ' pyTree ' , ' hangman ' , ' SlashDot ' , ' XMLtreeview ' ] ) ,
1999-04-29 23:29:54 -04:00
]
#---------------------------------------------------------------------------
class wxPythonDemo ( wxFrame ) :
def __init__ ( self , parent , id , title ) :
1999-09-30 03:11:20 -04:00
wxFrame . __init__ ( self , parent , - 1 , title , size = ( 725 , 550 ) )
1999-11-25 02:08:14 -05:00
self . cwd = os . getcwd ( )
1999-04-29 23:29:54 -04:00
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 )
1999-10-16 02:08:16 -04:00
if _useSplitter :
splitter = wxSplitterWindow ( self , - 1 )
if _useNestedSplitter :
splitter2 = wxSplitterWindow ( splitter , - 1 )
logParent = nbParent = splitter2
else :
nbParent = splitter
logParent = wxFrame ( self , - 1 , " wxPython Demo: log window " ,
( 0 , 0 ) , ( 500 , 150 ) )
logParent . Show ( true )
else :
nbParent = self
logParent = wxFrame ( self , - 1 , " wxPython Demo: log window " ,
( 0 , 0 ) , ( 500 , 150 ) )
logParent . Show ( true )
1999-04-29 23:29:54 -04:00
# Prevent TreeCtrl from displaying all items after destruction
self . dying = false
# Make a File menu
self . mainmenu = wxMenuBar ( )
menu = wxMenu ( )
1999-09-30 03:11:20 -04:00
exitID = wxNewId ( )
1999-10-06 02:22:25 -04:00
menu . Append ( exitID , ' E&xit \t Alt-X ' , ' Get the heck outta here! ' )
1999-09-30 03:11:20 -04:00
EVT_MENU ( self , exitID , self . OnFileExit )
1999-04-29 23:29:54 -04:00
self . mainmenu . Append ( menu , ' &File ' )
1999-09-13 15:31:50 -04:00
# 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 ' )
1999-04-29 23:29:54 -04:00
# Make a Help menu
1999-09-30 03:11:20 -04:00
helpID = wxNewId ( )
1999-04-29 23:29:54 -04:00
menu = wxMenu ( )
1999-09-30 03:11:20 -04:00
menu . Append ( helpID , ' &About \t Ctrl-H ' , ' wxPython RULES!!! ' )
EVT_MENU ( self , helpID , self . OnHelpAbout )
1999-04-29 23:29:54 -04:00
self . mainmenu . Append ( menu , ' &Help ' )
self . SetMenuBar ( self . mainmenu )
1999-09-30 03:11:20 -04:00
# set the menu accellerator table...
1999-10-06 02:22:25 -04:00
aTable = wxAcceleratorTable ( [ ( wxACCEL_ALT , ord ( ' X ' ) , exitID ) ,
1999-09-30 03:11:20 -04:00
( wxACCEL_CTRL , ord ( ' H ' ) , helpID ) ] )
self . SetAcceleratorTable ( aTable )
1999-06-22 03:03:29 -04:00
1999-04-29 23:29:54 -04:00
# Create a TreeCtrl
1999-10-16 02:08:16 -04:00
if _useSplitter :
tID = wxNewId ( )
self . treeMap = { }
self . tree = wxTreeCtrl ( splitter , tID )
2000-01-04 23:58:23 -05:00
#self.tree.SetBackgroundColour(wxNamedColour("Pink"))
1999-10-16 02:08:16 -04:00
root = self . tree . AddRoot ( " Overview " )
1999-12-11 02:59:23 -05:00
firstChild = None
1999-10-16 02:08:16 -04:00
for item in _treeList :
child = self . tree . AppendItem ( root , item [ 0 ] )
1999-12-11 02:59:23 -05:00
if not firstChild : firstChild = child
1999-10-16 02:08:16 -04:00
for childItem in item [ 1 ] :
theDemo = self . tree . AppendItem ( child , childItem )
self . treeMap [ childItem ] = theDemo
self . tree . Expand ( root )
1999-12-11 02:59:23 -05:00
self . tree . Expand ( firstChild )
1999-10-16 02:08:16 -04:00
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 )
1999-04-29 23:29:54 -04:00
# Create a Notebook
1999-10-16 02:08:16 -04:00
self . nb = wxNotebook ( nbParent , - 1 )
1999-04-29 23:29:54 -04:00
# Set up a TextCtrl on the Overview Notebook page
1999-09-02 01:31:38 -04:00
self . ovr = wxTextCtrl ( self . nb , - 1 , style = wxTE_MULTILINE | wxTE_READONLY )
1999-04-29 23:29:54 -04:00
self . nb . AddPage ( self . ovr , " Overview " )
# Set up a TextCtrl on the Demo Code Notebook page
1999-09-02 01:31:38 -04:00
self . txt = wxTextCtrl ( self . nb , - 1 ,
style = wxTE_MULTILINE | wxTE_READONLY | wxHSCROLL )
1999-06-22 03:03:29 -04:00
self . txt . SetFont ( wxFont ( 9 , wxMODERN , wxNORMAL , wxNORMAL , false ) )
1999-04-29 23:29:54 -04:00
self . nb . AddPage ( self . txt , " Demo Code " )
# Set up a log on the View Log Notebook page
1999-10-16 02:08:16 -04:00
self . log = wxTextCtrl ( logParent , - 1 ,
1999-09-02 01:31:38 -04:00
style = wxTE_MULTILINE | wxTE_READONLY | wxHSCROLL )
1999-04-29 23:29:54 -04:00
( w , self . charHeight ) = self . log . GetTextExtent ( ' X ' )
1999-09-17 01:55:00 -04:00
self . WriteText ( ' wxPython Demo Log: \n ' )
1999-04-29 23:29:54 -04:00
1999-11-10 17:47:12 -05:00
self . Show ( true )
1999-04-29 23:29:54 -04:00
# add the windows to the splitter and split it.
1999-10-16 02:08:16 -04:00
if _useSplitter :
if _useNestedSplitter :
splitter2 . SplitHorizontally ( self . nb , self . log )
splitter2 . SetSashPosition ( 360 , true )
splitter2 . SetMinimumPaneSize ( 20 )
splitter . SplitVertically ( self . tree , splitter2 )
else :
splitter . SplitVertically ( self . tree , self . nb )
splitter . SetSashPosition ( 180 , true )
splitter . SetMinimumPaneSize ( 20 )
1999-04-29 23:29:54 -04:00
# make our log window be stdout
1999-05-01 22:06:43 -04:00
#sys.stdout = self
1999-04-29 23:29:54 -04:00
1999-06-22 03:03:29 -04:00
# select initial items
self . nb . SetSelection ( 0 )
1999-10-16 02:08:16 -04:00
if _useSplitter :
self . tree . SelectItem ( root )
1999-09-13 15:31:50 -04:00
if len ( sys . argv ) == 2 :
try :
selectedDemo = self . treeMap [ sys . argv [ 1 ] ]
except :
selectedDemo = None
1999-10-16 02:08:16 -04:00
if selectedDemo and _useSplitter :
1999-09-13 15:31:50 -04:00
self . tree . SelectItem ( selectedDemo )
self . tree . EnsureVisible ( selectedDemo )
1999-06-22 03:03:29 -04:00
1999-10-29 18:26:06 -04:00
self . WriteText ( ' window handle: %s \n ' % self . GetHandle ( ) )
1999-10-29 18:25:04 -04:00
1999-04-29 23:29:54 -04:00
#---------------------------------------------
def WriteText ( self , text ) :
self . log . WriteText ( text )
1999-05-01 20:04:00 -04:00
w , h = self . log . GetClientSizeTuple ( )
numLines = h / self . charHeight
x , y = self . log . PositionToXY ( self . log . GetLastPosition ( ) )
1999-09-17 01:55:00 -04:00
if y > numLines :
self . log . ShowPosition ( self . log . XYToPosition ( x , y - numLines ) )
##self.log.ShowPosition(self.log.GetLastPosition())
1999-06-28 00:08:58 -04:00
self . log . SetInsertionPointEnd ( )
1999-04-29 23:29:54 -04:00
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
1999-10-16 02:08:16 -04:00
item = event . GetItem ( )
itemText = self . tree . GetItemText ( item )
self . RunDemo ( itemText )
#---------------------------------------------
def RunDemo ( self , itemText ) :
1999-11-25 02:08:14 -05:00
os . chdir ( self . cwd )
1999-04-29 23:29:54 -04:00
if self . nb . GetPageCount ( ) == 3 :
if self . nb . GetSelection ( ) == 2 :
self . nb . SetSelection ( 0 )
self . nb . DeletePage ( 2 )
if itemText == ' Overview ' :
self . GetDemoFile ( ' Main.py ' )
self . SetOverview ( ' Overview ' , overview )
self . nb . Refresh ( ) ;
1999-09-10 02:25:47 -04:00
self . window = None
1999-04-29 23:29:54 -04:00
else :
if os . path . exists ( itemText + ' .py ' ) :
1999-10-22 22:33:44 -04:00
wxBeginBusyCursor ( )
1999-04-29 23:29:54 -04:00
self . GetDemoFile ( itemText + ' .py ' )
module = __import__ ( itemText , globals ( ) )
self . SetOverview ( itemText , module . overview )
1999-10-22 22:33:44 -04:00
wxEndBusyCursor ( )
1999-04-29 23:29:54 -04:00
# in case runTest is modal, make sure things look right...
self . nb . Refresh ( ) ;
wxYield ( )
1999-09-10 02:25:47 -04:00
self . window = module . runTest ( self , self . nb , self )
if self . window :
self . nb . AddPage ( self . window , ' Demo ' )
1999-10-16 02:08:16 -04:00
#self.nb.ResizeChildren()
1999-04-29 23:29:54 -04:00
self . nb . SetSelection ( 2 )
2000-02-13 01:01:58 -05:00
#self.window.Refresh()
1999-10-22 22:33:44 -04:00
#self.nb.ResizeChildren()
1999-10-16 02:08:16 -04:00
#if self.window.GetAutoLayout():
# self.window.Layout()
1999-04-29 23:29:54 -04:00
else :
self . ovr . Clear ( )
self . txt . Clear ( )
1999-09-10 02:25:47 -04:00
self . window = None
1999-04-29 23:29:54 -04:00
1999-09-30 03:11:20 -04:00
1999-04-29 23:29:54 -04:00
#---------------------------------------------
# Get the Demo files
def GetDemoFile ( self , filename ) :
self . txt . Clear ( )
1999-06-22 03:03:29 -04:00
#if not self.txt.LoadFile(filename):
# self.txt.WriteText("Cannot open %s file." % filename)
try :
self . txt . SetValue ( open ( filename ) . read ( ) )
1999-07-31 03:56:15 -04:00
except IOError :
1999-04-29 23:29:54 -04:00
self . txt . WriteText ( " Cannot open %s file. " % filename )
1999-06-22 03:03:29 -04:00
1999-04-29 23:29:54 -04:00
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 ) :
1999-09-13 15:31:50 -04:00
#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)
1999-09-17 01:55:00 -04:00
from About import MyAboutBox
1999-09-13 15:31:50 -04:00
about = MyAboutBox ( self )
1999-04-29 23:29:54 -04:00
about . ShowModal ( )
about . Destroy ( )
#---------------------------------------------
def OnCloseWindow ( self , event ) :
self . dying = true
1999-09-10 02:25:47 -04:00
self . window = None
1999-09-18 14:21:02 -04:00
self . mainmenu = None
1999-04-29 23:29:54 -04:00
self . Destroy ( )
#---------------------------------------------
def OnIdle ( self , event ) :
if self . otherWin :
self . otherWin . Raise ( )
1999-09-10 02:25:47 -04:00
self . window = self . otherWin
1999-04-29 23:29:54 -04:00
self . otherWin = None
1999-09-13 15:31:50 -04:00
#---------------------------------------------
def OnDemoMenu ( self , event ) :
1999-10-16 02:08:16 -04:00
if _useSplitter :
try :
selectedDemo = self . treeMap [ self . mainmenu . GetLabel ( event . GetId ( ) ) ]
except :
selectedDemo = None
if selectedDemo :
self . tree . SelectItem ( selectedDemo )
self . tree . EnsureVisible ( selectedDemo )
else :
self . RunDemo ( self . mainmenu . GetLabel ( event . GetId ( ) ) )
1999-09-13 15:31:50 -04:00
1999-04-29 23:29:54 -04:00
#---------------------------------------------------------------------------
#---------------------------------------------------------------------------
class MyApp ( wxApp ) :
def OnInit ( self ) :
wxImage_AddHandler ( wxJPEGHandler ( ) )
wxImage_AddHandler ( wxPNGHandler ( ) )
wxImage_AddHandler ( wxGIFHandler ( ) )
1999-11-20 16:15:12 -05:00
self . splash = SplashScreen ( None , bitmapfile = ' bitmaps/splash.gif ' ,
duration = 4000 , callback = self . AfterSplash )
self . splash . Show ( true )
wxYield ( )
return true
def AfterSplash ( self ) :
self . splash . Close ( true )
frame = wxPythonDemo ( None , - 1 , " wxPython: (A Demonstration) " )
1999-04-29 23:29:54 -04:00
frame . Show ( true )
self . SetTopWindow ( frame )
return true
#---------------------------------------------------------------------------
def main ( ) :
2000-02-01 16:36:20 -05:00
try :
demoPath = os . path . split ( __file__ ) [ 0 ]
os . chdir ( demoPath )
except :
pass
1999-04-29 23:29:54 -04:00
app = MyApp ( 0 )
app . MainLoop ( )
#---------------------------------------------------------------------------
overview = """ \
Python
- - - - - - - - - - - -
Python is an interpreted , interactive , object - oriented programming language often compared to Tcl , Perl , Scheme , or Java .
Python combines remarkable power with very clear syntax . It has modules , classes , exceptions , very high level dynamic data types , and dynamic typing . There are interfaces to many system calls and libraries , and new built - in modules are easily written in C or C + + . Python is also usable as an extension language for applications that need a programmable interface .
wxWindows
- - - - - - - - - - - - - - - - - - - -
wxWindows is a free C + + framework designed to make cross - platform programming child ' s play. Well, almost. wxWindows 2 supports Windows 3.1/95/98/NT, Unix with GTK/Motif/Lesstif, with a Mac version underway. Other ports are under consideration.
wxWindows is a set of libraries that allows C + + applications to compile and run on several different types of computers , with minimal source code changes . There is one library per supported GUI ( such as Motif , or Windows ) . As well as providing a common API ( Application Programming Interface ) for GUI functionality , it provides functionality for accessing some commonly - used operating system facilities , such as copying or deleting files . wxWindows is a ' framework ' in the sense that it provides a lot of built - in functionality , which the application can use or replace as required , thus saving a great deal of coding effort . Basic data structures such as strings , linked lists and hash tables are also supported .
wxPython
- - - - - - - - - - - - - - - -
wxPython is a Python extension module that encapsulates the wxWindows GUI classes . Currently it is only available for the Win32 and GTK ports of wxWindows , but as soon as the other ports are brought up to the same level as Win32 and GTK , it should be fairly trivial to enable wxPython to be used with the new GUI .
The wxPython extension module attempts to mirror the class heiarchy of wxWindows as closely as possible . This means that there is a wxFrame class in wxPython that looks , smells , tastes and acts almost the same as the wxFrame class in the C + + version . Unfortunately , because of differences in the languages , wxPython doesn ' t match wxWindows exactly, but the differences should be easy to absorb because they are natural to Python. For example, some methods that return multiple values via argument pointers in C++ will return a tuple of values in Python.
There is still much to be done for wxPython , many classes still need to be mirrored . Also , wxWindows is still somewhat of a moving target so it is a bit of an effort just keeping wxPython up to date . On the other hand , there are enough of the core classes completed that useful applications can be written .
wxPython is close enough to the C + + version that the majority of the wxPython documentation is actually just notes attached to the C + + documents that describe the places where wxPython is different . There is also a series of sample programs included , and a series of documentation pages that assist the programmer in getting started with wxPython .
"""
#----------------------------------------------------------------------------
#----------------------------------------------------------------------------
if __name__ == ' __main__ ' :
main ( )
#----------------------------------------------------------------------------