--- /dev/null
+/////////////////////////////////////////////////////////////////////////////
+// Name: python
+// Purpose: topic overview
+// Author: wxWidgets team
+// RCS-ID: $Id$
+// Licence: wxWindows license
+/////////////////////////////////////////////////////////////////////////////
+
+/*!
+
+ @page python_overview wxPython overview
+
+ This topic was written by Robin Dunn, author of the wxPython wrapper.
+ @ref pwhat_overview
+ @ref pwhy_overview
+ @ref pother_overview
+ @ref pusing_overview
+ @ref pclasses_overview
+ @ref phelp_overview
+
+
+ @section wxpwhat What is wxPython?
+
+ wxPython is a blending of the wxWidgets GUI classes and the
+ #Python programming language.
+ @b Python
+ So what is Python? Go to
+ #http://www.python.org to learn more,
+ but in a nutshell Python is an interpreted,
+ interactive, object-oriented programming language. It is 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.
+ Python is copyrighted but freely usable and distributable, even for
+ commercial use.
+ @b wxPython
+ wxPython is a Python package that can be imported at runtime that
+ includes a collection of Python modules and an extension module
+ (native code). It provides a series of Python classes that mirror (or
+ shadow) many of the wxWidgets GUI classes. This extension module
+ attempts to mirror the class hierarchy of wxWidgets 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.
+ wxPython is very versatile. It can be used to create standalone GUI
+ applications, or in situations where Python is embedded in a C++
+ application as an internal scripting or macro language.
+ Currently wxPython is available for Win32 platforms and the GTK
+ toolkit (wxGTK) on most Unix/X-windows platforms. See the wxPython
+ website #http://wxPython.org/ for
+ details about getting wxPython working for you.
+
+ @section wxpwhy Why use wxPython?
+
+ So why would you want to use wxPython over just C++ and wxWidgets?
+ Personally I prefer using Python for everything. I only use C++ when I
+ absolutely have to eke more performance out of an algorithm, and even
+ then I usually code it as an extension module and leave the majority
+ of the program in Python.
+ Another good thing to use wxPython for is quick prototyping of your
+ wxWidgets apps. With C++ you have to continuously go though the
+ edit-compile-link-run cycle, which can be quite time consuming. With
+ Python it is only an edit-run cycle. You can easily build an
+ application in a few hours with Python that would normally take a few
+ days or longer with C++. Converting a wxPython app to a C++/wxWidgets app
+ should be a straight forward task.
+
+ @section wxpother Other Python GUIs
+
+ There are other GUI solutions out there for Python.
+ @b Tkinter
+ Tkinter is the de facto standard GUI for Python. It is available
+ on nearly every platform that Python and Tcl/TK are. Why Tcl/Tk?
+ Well because Tkinter is just a wrapper around Tcl's GUI toolkit, Tk.
+ This has its upsides and its downsides...
+ The upside is that Tk is a pretty versatile toolkit. It can be made
+ to do a lot of things in a lot of different environments. It is fairly
+ easy to create new widgets and use them interchangeably in your
+ programs.
+ The downside is Tcl. When using Tkinter you actually have two
+ separate language interpreters running, the Python interpreter and the
+ Tcl interpreter for the GUI. Since the guts of Tcl is mostly about
+ string processing, it is fairly slow as well. (Not too bad on a fast
+ Pentium II, but you really notice the difference on slower machines.)
+ It wasn't until the latest version of Tcl/Tk that native Look and
+ Feel was possible on non-Motif platforms. This is because Tk
+ usually implements its own widgets (controls) even when there are
+ native controls available.
+ Tkinter is a pretty low-level toolkit. You have to do a lot of work
+ (verbose program code) to do things that would be much simpler with a higher
+ level of abstraction.
+ @b PythonWin
+ PythonWin is an add-on package for Python for the Win32 platform. It
+ includes wrappers for MFC as well as much of the Win32 API. Because
+ of its foundation, it is very familiar for programmers who have
+ experience with MFC and the Win32 API. It is obviously not compatible
+ with other platforms and toolkits. PythonWin is organized as separate
+ packages and modules so you can use the pieces you need without having
+ to use the GUI portions.
+ @b Others
+ There are quite a few other GUI modules available for Python, some in
+ active use, some that haven't been updated for ages. Most are simple
+ wrappers around some C or C++ toolkit or another, and most are not
+ cross-platform compatible. See @ref Graphics_overview
+ for a listing of a few of them.
+
+ @section wxpusing Using wxPython
+
+ @b First things first...
+ I'm not going to try and teach the Python language here. You can do
+ that at the http://www.python.org/doc/tut/tut.html.
+ I'm also going to assume that you know a bit about wxWidgets already,
+ enough to notice the similarities in the classes used.
+ Take a look at the following wxPython program. You can find a similar
+ program in the @c wxPython/demo directory, named @c DialogUnits.py. If your
+ Python and wxPython are properly installed, you should be able to run
+ it by issuing this command:
+
+
+ @b @c python DialogUnits.py
+
+
+
+
+
+ @code
+ 001: ## import all of the wxPython GUI package
+ 002: from wxPython.wx import *
+ 003:
+ 004: ## Create a new frame class, derived from the wxPython Frame.
+ 005: class MyFrame(wxFrame):
+ 006:
+ 007: def __init__(self, parent, id, title):
+ 008: # First, call the base class' __init__ method to create the frame
+ 009: wxFrame.__init__(self, parent, id, title,
+ 010: wxPoint(100, 100), wxSize(160, 100))
+ 011:
+ 012: # Associate some events with methods of this class
+ 013: EVT_SIZE(self, self.OnSize)
+ 014: EVT_MOVE(self, self.OnMove)
+ 015:
+ 016: # Add a panel and some controls to display the size and position
+ 017: panel = wxPanel(self, -1)
+ 018: wxStaticText(panel, -1, "Size:",
+ 019: wxDLG_PNT(panel, wxPoint(4, 4)), wxDefaultSize)
+ 020: wxStaticText(panel, -1, "Pos:",
+ 021: wxDLG_PNT(panel, wxPoint(4, 14)), wxDefaultSize)
+ 022: self.sizeCtrl = wxTextCtrl(panel, -1, "",
+ 023: wxDLG_PNT(panel, wxPoint(24, 4)),
+ 024: wxDLG_SZE(panel, wxSize(36, -1)),
+ 025: wxTE_READONLY)
+ 026: self.posCtrl = wxTextCtrl(panel, -1, "",
+ 027: wxDLG_PNT(panel, wxPoint(24, 14)),
+ 028: wxDLG_SZE(panel, wxSize(36, -1)),
+ 029: wxTE_READONLY)
+ 030:
+ 031:
+ 032: # This method is called automatically when the CLOSE event is
+ 033: # sent to this window
+ 034: def OnCloseWindow(self, event):
+ 035: # tell the window to kill itself
+ 036: self.Destroy()
+ 037:
+ 038: # This method is called by the system when the window is resized,
+ 039: # because of the association above.
+ 040: def OnSize(self, event):
+ 041: size = event.GetSize()
+ 042: self.sizeCtrl.SetValue("%s, %s" % (size.width, size.height))
+ 043:
+ 044: # tell the event system to continue looking for an event handler,
+ 045: # so the default handler will get called.
+ 046: event.Skip()
+ 047:
+ 048: # This method is called by the system when the window is moved,
+ 049: # because of the association above.
+ 050: def OnMove(self, event):
+ 051: pos = event.GetPosition()
+ 052: self.posCtrl.SetValue("%s, %s" % (pos.x, pos.y))
+ 053:
+ 054:
+ 055: # Every wxWidgets application must have a class derived from wxApp
+ 056: class MyApp(wxApp):
+ 057:
+ 058: # wxWidgets calls this method to initialize the application
+ 059: def OnInit(self):
+ 060:
+ 061: # Create an instance of our customized Frame class
+ 062: frame = MyFrame(@NULL, -1, "This is a test")
+ 063: frame.Show(@true)
+ 064:
+ 065: # Tell wxWidgets that this is our main window
+ 066: self.SetTopWindow(frame)
+ 067:
+ 068: # Return a success flag
+ 069: return @true
+ 070:
+ 071:
+ 072: app = MyApp(0) # Create an instance of the application class
+ 073: app.MainLoop() # Tell it to start processing events
+ 074:
+ @endcode
+
+
+
+ @b Things to notice
+
+
+ At line 2 the wxPython classes, constants, and etc. are imported
+ into the current module's namespace. If you prefer to reduce
+ namespace pollution you can use "@c from wxPython import wx" and
+ then access all the wxPython identifiers through the wx module, for
+ example, "@c wx.wxFrame".
+ At line 13 the frame's sizing and moving events are connected to
+ methods of the class. These helper functions are intended to be like
+ the event table macros that wxWidgets employs. But since static event
+ tables are impossible with wxPython, we use helpers that are named the
+ same to dynamically build the table. The only real difference is
+ that the first argument to the event helpers is always the window that
+ the event table entry should be added to.
+ Notice the use of @c wxDLG_PNT and @c wxDLG_SZE in lines 19
+ - 29 to convert from dialog units to pixels. These helpers are unique
+ to wxPython since Python can't do method overloading like C++.
+ There is an @c OnCloseWindow method at line 34 but no call to
+ EVT_CLOSE to attach the event to the method. Does it really get
+ called? The answer is, yes it does. This is because many of the
+ standard events are attached to windows that have the associated
+ standard method names. I have tried to follow the lead of the
+ C++ classes in this area to determine what is standard but since
+ that changes from time to time I can make no guarantees, nor will it
+ be fully documented. When in doubt, use an EVT_*** function.
+ At lines 17 to 21 notice that there are no saved references to
+ the panel or the static text items that are created. Those of you
+ who know Python might be wondering what happens when Python deletes
+ these objects when they go out of scope. Do they disappear from the GUI? They
+ don't. Remember that in wxPython the Python objects are just shadows of the
+ corresponding C++ objects. Once the C++ windows and controls are
+ attached to their parents, the parents manage them and delete them
+ when necessary. For this reason, most wxPython objects do not need to
+ have a __del__ method that explicitly causes the C++ object to be
+ deleted. If you ever have the need to forcibly delete a window, use
+ the Destroy() method as shown on line 36.
+ Just like wxWidgets in C++, wxPython apps need to create a class
+ derived from @c wxApp (line 56) that implements a method named
+ @c OnInit, (line 59.) This method should create the application's
+ main window (line 62) and use @c wxApp.SetTopWindow() (line 66) to
+ inform wxWidgets about it.
+ And finally, at line 72 an instance of the application class is
+ created. At this point wxPython finishes initializing itself, and calls
+ the @c OnInit method to get things started. (The zero parameter here is
+ a flag for functionality that isn't quite implemented yet. Just
+ ignore it for now.) The call to @c MainLoop at line 73 starts the event
+ loop which continues until the application terminates or all the top
+ level windows are closed.
+
+
+
+ @section wxpclasses wxWidgets classes implemented in wxPython
+
+ The following classes are supported in wxPython. Most provide nearly
+ full implementations of the public interfaces specified in the C++
+ documentation, others are less so. They will all be brought as close
+ as possible to the C++ spec over time.
+
+
+ #wxAcceleratorEntry
+ #wxAcceleratorTable
+ #wxActivateEvent
+ #wxBitmap
+ #wxBitmapButton
+ #wxBitmapDataObject
+ wxBMPHandler
+ #wxBoxSizer
+ #wxBrush
+ #wxBusyInfo
+ #wxBusyCursor
+ #wxButton
+ #wxCalculateLayoutEvent
+ #wxCalendarCtrl
+ #wxCaret
+ #wxCheckBox
+ #wxCheckListBox
+ #wxChoice
+ #wxClientDC
+ #wxClipboard
+ #wxCloseEvent
+ #wxColourData
+ #wxColourDialog
+ #wxColour
+ #wxComboBox
+ #wxCommandEvent
+ #wxConfig
+ #wxControl
+ #wxCursor
+ #wxCustomDataObject
+ #wxDataFormat
+ #wxDataObject
+ #wxDataObjectComposite
+ #wxDataObjectSimple
+ #wxDateTime
+ #wxDateSpan
+ #wxDC
+ #wxDialog
+ #wxDirDialog
+ #wxDragImage
+ #wxDropFilesEvent
+ #wxDropSource
+ #wxDropTarget
+ #wxEraseEvent
+ #wxEvent
+ #wxEvtHandler
+ #wxFileConfig
+ #wxFileDataObject
+ #wxFileDialog
+ #wxFileDropTarget
+ #wxFileSystem
+ #wxFileSystemHandler
+ #wxFocusEvent
+ #wxFontData
+ #wxFontDialog
+ #wxFont
+ #wxFrame
+ #wxFSFile
+ #wxGauge
+ wxGIFHandler
+ #wxGLCanvas
+ #wxHtmlCell
+ #wxHtmlContainerCell
+ #wxHtmlDCRenderer
+ #wxHtmlEasyPrinting
+ #wxHtmlParser
+ #wxHtmlTagHandler
+ #wxHtmlTag
+ #wxHtmlWinParser
+ #wxHtmlPrintout
+ #wxHtmlWinTagHandler
+ #wxHtmlWindow
+ #wxIconizeEvent
+ #wxIcon
+ #wxIdleEvent
+ #wxImage
+ #wxImageHandler
+ #wxImageList
+ #wxIndividualLayoutConstraint
+ #wxInitDialogEvent
+ #wxInputStream
+ #wxInternetFSHandler
+ #wxJoystickEvent
+ wxJPEGHandler
+ #wxKeyEvent
+ #wxLayoutAlgorithm
+ #wxLayoutConstraints
+ #wxListBox
+ #wxListCtrl
+ #wxListEvent
+ #wxListItem
+ #wxMask
+ #wxMaximizeEvent
+ #wxMDIChildFrame
+ #wxMDIClientWindow
+ #wxMDIParentFrame
+ #wxMemoryDC
+ #wxMemoryFSHandler
+ #wxMenuBar
+ #wxMenuEvent
+ #wxMenuItem
+ #wxMenu
+ #wxMessageDialog
+ #wxMetaFileDC
+ #wxMiniFrame
+ #wxMouseEvent
+ #wxMoveEvent
+ #wxNotebookEvent
+ #wxNotebook
+ #wxPageSetupDialogData
+ #wxPageSetupDialog
+ #wxPaintDC
+ #wxPaintEvent
+ #wxPalette
+ #wxPanel
+ #wxPen
+ wxPNGHandler
+ #wxPoint
+ #wxPostScriptDC
+ #wxPreviewFrame
+ #wxPrintData
+ #wxPrintDialogData
+ #wxPrintDialog
+ #wxPrinter
+ #wxPrintPreview
+ #wxPrinterDC
+ #wxPrintout
+ #wxProcess
+ #wxQueryLayoutInfoEvent
+ #wxRadioBox
+ #wxRadioButton
+ #wxRealPoint
+ #wxRect
+ #wxRegionIterator
+ #wxRegion
+ #wxSashEvent
+ #wxSashLayoutWindow
+ #wxSashWindow
+ #wxScreenDC
+ #wxScrollBar
+ #wxScrollEvent
+ #wxScrolledWindow
+ #wxScrollWinEvent
+ wxShowEvent
+ #wxSingleChoiceDialog
+ #wxSizeEvent
+ #wxSize
+ #wxSizer
+ #wxSizerItem
+ #wxSlider
+ #wxSpinButton
+ #wxSpinEvent
+ #wxSplitterWindow
+ #wxStaticBitmap
+ #wxStaticBox
+ #wxStaticBoxSizer
+ #wxStaticLine
+ #wxStaticText
+ #wxStatusBar
+ #wxSysColourChangedEvent
+ #wxTaskBarIcon
+ #wxTextCtrl
+ #wxTextDataObject
+ #wxTextDropTarget
+ #wxTextEntryDialog
+ #wxTimer
+ #wxTimerEvent
+ #wxTimeSpan
+ #wxTipProvider
+ wxToolBarTool
+ #wxToolBar
+ #wxToolTip
+ #wxTreeCtrl
+ #wxTreeEvent
+ #wxTreeItemData
+ wxTreeItemId
+ #wxUpdateUIEvent
+ #wxValidator
+ #wxWindowDC
+ #wxWindow
+ #wxZipFSHandler
+
+
+
+ @section wxphelp Where to go for help
+
+ Since wxPython is a blending of multiple technologies, help comes from
+ multiple sources. See
+ #http://wxpython.org/ for details on
+ various sources of help, but probably the best source is the
+ wxPython-users mail list. You can view the archive or subscribe by
+ going to
+ #http://lists.wxwindows.org/mailman/listinfo/wxpython-users
+ Or you can send mail directly to the list using this address:
+ wxpython-users@lists.wxwindows.org
+
+ */
+
+