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 *
#---------------------------------------------------------------------------
_treeList = [
( ' Managed Windows ' , [ ' wxFrame ' , ' wxDialog ' , ' wxMiniFrame ' ] ) ,
( ' Miscellaneous Windows ' , [ ' wxGrid ' , ' wxSashWindow ' ,
' wxScrolledWindow ' , ' wxSplitterWindow ' ,
1999-09-13 15:31:50 -04:00
' wxStatusBar ' , ' wxToolBar ' , ' wxNotebook ' ,
' 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 ' ,
' wxRadioBox ' , ' wxSlider ' ] ) ,
1999-09-30 03:11:20 -04:00
( ' Window Layout ' , [ ' wxLayoutConstraints ' , ' Sizers ' , ' OldSizers ' ] ) ,
1999-04-29 23:29:54 -04:00
1999-09-30 03:11:20 -04:00
( ' Miscellaneous ' , [ ' wxTimer ' , ' wxValidator ' , ' wxGLCanvas ' , ' DialogUnits ' ,
' wxImage ' , ' PrintFramework ' , ' wxOGL ' ] ) ,
1999-04-29 23:29:54 -04:00
1999-09-30 03:11:20 -04:00
( ' wxPython Library ' , [ ' OldSizers ' , ' Layoutf ' , ' wxScrolledMessageDialog ' ,
1999-10-06 02:22:25 -04:00
' wxMultipleChoiceDialog ' , ' wxPlotCanvas ' , ' wxFloatBar ' ,
' PyShell ' ] ) ,
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-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 )
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 ( )
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-09-13 15:31:50 -04:00
tID = wxNewId ( )
self . treeMap = { }
1999-04-29 23:29:54 -04:00
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 ] :
1999-06-22 03:03:29 -04:00
theDemo = self . tree . AppendItem ( child , childItem )
1999-09-13 15:31:50 -04:00
self . treeMap [ childItem ] = theDemo
1999-06-22 03:03:29 -04:00
1999-04-29 23:29:54 -04:00
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
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-09-02 01:31:38 -04:00
self . log = wxTextCtrl ( splitter2 , - 1 ,
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
# 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
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 )
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
if selectedDemo :
self . tree . SelectItem ( selectedDemo )
self . tree . EnsureVisible ( selectedDemo )
1999-06-22 03:03:29 -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
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 . 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 ' ) :
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 ( )
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-06 02:22:25 -04:00
self . nb . ResizeChildren ( )
1999-04-29 23:29:54 -04:00
self . nb . SetSelection ( 2 )
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 ) :
try :
selectedDemo = self . treeMap [ self . mainmenu . GetLabel ( event . GetId ( ) ) ]
except :
selectedDemo = None
if selectedDemo :
self . tree . SelectItem ( selectedDemo )
self . tree . EnsureVisible ( selectedDemo )
1999-04-29 23:29:54 -04:00
#---------------------------------------------------------------------------
#---------------------------------------------------------------------------
class MyApp ( wxApp ) :
def OnInit ( self ) :
wxImage_AddHandler ( wxJPEGHandler ( ) )
wxImage_AddHandler ( wxPNGHandler ( ) )
wxImage_AddHandler ( wxGIFHandler ( ) )
frame = wxPythonDemo ( NULL , - 1 , " wxPython: (A Demonstration) " )
frame . Show ( true )
self . SetTopWindow ( frame )
return true
#---------------------------------------------------------------------------
def main ( ) :
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 ( )
#----------------------------------------------------------------------------