ANN: wxPython released

Robin Dunn robin at
Thu Oct 19 20:21:10 CEST 2006


The release of wxPython is now available for download at  This release is the first offical
release in the 2.7.x development series, and includes a lot of new
features, enhancements and fixes.  Source and binaries are available
for both Python 2.4 and 2.5 for Windows and Mac, as well some pacakges
for varous Linux distributions.  A summary of changes is listed below
and also at

What is wxPython?

wxPython is a GUI toolkit for the Python programming language. It
allows Python programmers to create programs with a robust, highly
functional graphical user interface, simply and easily. It is
implemented as a Python extension module that wraps the GUI components
of the popular wxWidgets cross platform library, which is written in

wxPython is a cross-platform toolkit. This means that the same program
will usually run on multiple platforms without modifications.
Currently supported platforms are 32-bit Microsoft Windows, most Linux
or other Unix-like systems using GTK2, and Mac OS X 10.3+, in most
cases the native widgets are used on each platform.

Changes in

The following deprecated items have been removed:

     * wx.Bitmap SetQuality and GetQuality methods

     * The wx.GetNumberFromUser function


     * wx.BookCtrlSizer and wx.NotebookSizer

     * The PostScript-specific methods of wx.PrintData

     * wx.PrintDialogData SetSetupDialog and GetSetupDialog methods

     * wx.FontMapper SetConfig method

     * wx.html.HtmlSearchStatus.GetContentsItem method

     * wx.html.HtmlHelpData.GetContents, GetContentsCnt, GetIndex, and
       GetIndexCnt methods

wx.EventLoop is now implemented for wxMac.

Added wxPython wrappers for the new wx.Treebook and wx.Toolbook

wx.DC.BeginDrawing and EndDrawing have been deprecated in the C++
code, so since they never really did anything before they are now just
empty stubs in wxPython.

Solved a problem that has been around for a very long time in how C++
methods are virtualized for overriding in derived Python classes.
Previously we couldn't do it for methods that needed to also exist in
the base class wrappers such that they could be called normally.  (The
reasons are long and complex, but suffice it to say that it was due to
mixing C++'s dynamic dispatch, and Python's runtime lookup of the
method attributes resulting in endless recursion of function calls.)
Because of this problem I used a hack that I have always hated, and
that is renaming the base class methods with a "base_*" prefix, for
example wx.Printout.base_OnBeginDocument.  Now that the problem has
finally been solved I have replaced all the base_Whatever() methods
with the real Whatever() method as well as a simple wrapper named
base_Whatever that is marked as deprecated.  So now instead of writing
your overridden methods like this::

     def OnBeginDocument(self, start, end):
	# do something here
	return self.base_OnBeginDocument(start, end)

You can now call the base class method the normal way, like this::

     def OnBeginDocument(self, start, end):
	# do something here
	return Printout.OnBeginDocument(self, start, end)

Or like this with super()::

     def OnBeginDocument(self, start, end):
	# do something here
	return super(MyPrintout, self).OnBeginDocument(start, end)

Note that the old way with the "base_*" function still works, but you
will get a DeprecationWarning from calling base_OnBeginDocument.  The
classes affected by this are:

     * wx.DropSource
     * wx.DropTarget
     * wx.TextDropTarget
     * wx.FileDropTarget
     * wx.PyLog   (also added the ability to override Flush)
     * wx.PyApp   (also added the ability to override ExitMainLoop)
     * wx.Printout
     * wx.PyPrintPreview
     * wx.PyPreviewFrame
     * wx.PreviewControlBar
     * wx.Process
     * wx.PyControl
     * wx.PyPanel
     * wx.PyScrolledWindow
     * wx.PyWindow
     * wx.Timer
     * wx.grid.PyGridCellRenderer
     * wx.grid.PyGridCellEditor
     * wx.grid.PyGridCellAttrProvider
     * wx.grid.PyGridTableBase
     * wx.html.HtmlWindow
     * wx.wizard.PyWizardPage

Added the wx.DC.GradientFillConcentric and wx.DC.GradientFillLinear

wxGTK: wx.ListBox and wx.CheckListBox are now using native GTK2

Added wx.ListBox.HitTest() from patch 1446207

Bumped up to SWIG 1.3.29.  This provides some more runtime performance
boosts, gets rid of the dreaded Ptr classes, and some other nice new

Added wx.Window.GetScreenPosition and GetScreenRect which returns the
position of the window in screen coordinates, even if the window is
not a top-level window.

Added GetResourcesDir and GetLocalizedResourcesDir to

Added a GetReceivedFormat method to wx.DataObjectComposite.  You can
use this to find out what format of data object was recieved from the
source of the clipboard or DnD operation, and then you'll know which
of the component data objects to use to access the data.

Changed how the stock objects (wx.RED, wx.RED_PEN, wx.RED_BRUSH, etc.)
are initialized.  They are now created as uninitialized instances
using __new__.  Then after the wx.App has been created, but before
OnInit is called, the .this attribute of each object is initialized.
This was needed because of some delayed initialization functionality
that was implemented in wxWidgets, but the end result is cleaner for
wxPython as well, and allowed me to remove some ugly code previously
hidden under the covers.

Added wx.StandardPaths.GetDocumentsDir.

Added wx.RendererNative.DrawCheckButton.

wx.ProgressDialog.Update now returns a tuple of two values.  The first
is a continue flag (what was returned before) and the second is a skip
flag.  If the dialog has the wx.PD_CAN_SKIP flag and if the Skip
button is clicked, then the skip flag is set to True the next time
Update is called.

A DeprecationWarning is now issued when the old wxPython package is
imported.  If you are still using the old namespace please convert
your code to use the new wx package instead.

Added wrappers for Julian's new wxRichTextCtrl class, visible in
wxPython as wx.richtext.RichTextCtrl window.  It still needs some more
work, but it is a great start.

wx.lib.mixins.listctrl.TextEditMixin: Fixed the double END_LABEL_EDIT
event problem in TextEditMixin by checking if the editor was already
hidden before continuing with the CloseEditor method.  Also added code
to OpenEditor to send the BEGIN_LABEL_EDIT event and to not allow the
opening of the editor to continue if the event handler doesn't allow

wx.StaticBoxSizer now keeps better track of the wx.StaticBox, and it
will destroy it if the sizer is destroyed before the parent window is.

Added wx.HyperlinkCtrl.

Added battery and power related functions and events (wxMSW only so
far.)  See wx.PowerEvent, wx.GetPowerType and wx.GetBatteryState.

Added wx.ListCtrl.HitTestSubItem which returns the sub-item (i.e. the
column in report mode) that was hit (if any) in addition to the item
and flags.

Added wrappers for wx.ColourPickerCtrl, wx.DirPickerCtrl,
wx.FilePickerCtrl, and wx.FontPickerCtrl.

Patch #1502016 wx.Image.ConvertToGreyscale now retains the alpha

Added wrappers for the wxAUI classes, in the wx.aui module.

Added the PseudoDC class from Paul Lanier.  It provides a way to
record operations on a DC and then play them back later.

Upgraded to Scintilla 1.70 for

Added CanSetTransparent and SetTransparent methods to the
wx.TopLevelWindow class, with implementations (so far) for wxMSW and

SetDefaultItem() and GetDefaultItem() are now members of
wx.TopLevelWindow, not wx.Panel.

wxGTK: Stock items (icons) will be used for menu items with stock

Added wx.lib.combotreebox from Frank Niessink

Added wx.ImageFromBuffer, wx.BitmapFromBuffer and
wx.BitmapFromBufferRGBA factory functions.  They enable loading of an
image or bitmap directly from a Python object that implements the
buffer interface, such as strings, arrays, etc.

Added wx.App.IsDisplayAvailable() which can be used to determine if a
GUI can be created in the current environment.  (Still need an
implementation for wxMSW...)

The wx.html.HTML_FONT_SIZE_x constants are no longer available as the
default sizes are now calculated at runtime based on the size of the
normal GUI font.

wx.Colour now includes an alpha component, which defaults to
wx.ALPHA_OPAQUE.  This is in preparation for allowing various new
alpha blening functionality using wx.Colour objects, such as drawing
with pens and brushes on a wx.DC.

Added wx.NativePixelBuffer, wx.AlphPixelBuffer and related iterator
and accessor classes.  They allow platform independent direct access
to the platform specific pixel buffer inside of a wx.Bitmap object.

The beginnings of support for RTL languages has been added, thanks to
a Google SoC project.

Added wx.lib.dragscroller from Riaan Booysen.  It provides a helper
class that can used to scroll a wx.ScrolledWindow in response to a
mouse drag.

Applied patch 1551409: Adds support for indeterminate mode gauges.

wxMac: I've turned on the compile option for using the native toolbar
on the Mac now that it supports hosting of controls.  If the toolbar
is managed by the frame via either CreateToolBar() or SetToolBar()
then the native toolbar will be used.  Additional toolbars, or
toolbars that are not children of the frame, are managed by sizers or
what-not will still use the emulated toolbar because of platform
restrictions in how/where the native toolbar can be used.

Added Python properties for many of the getter/setter methods of wx
classes.  In order for the names to be predicatble for somebody
already familiar with wxPython the property names are simply the name
of the getter with the "Get" dropped.  For example, wx.Window has a
property named "Size" that maps to GetSize and SetSize.  So far there
is only one known name conflict using this naming convention, and that
is wx.KeyEvent.KeyCode, however since KeyCode was formerly a
compatibility alias for GetKeyCode (and has been for a long time) it
was decided to just switch it to a property.  If you want to use the
method then change your calls to event.KeyCode() to
event.GetKeyCode(), otherwise you can use it as a property just by
dropping the parentheses.

Updated the C++ code for wx.gizmos.TreeListCtrl from the wxCode
project.  This has resulted in some minor API changes, most of which
were worked around in the wrapper code.

Added wx.lib.delayedresult from Oliver Schoenborn.

Added wx.lib.expando, a multi-line textctrl that exands as more lines
are needed.

wx.Image.Scale and Rescale methods now take an extra parameter
specifying type of method to use for resampling the image.  It
defaults to the current behavior of just replicating pixels, if
wx.IMAGE_QUALITY_HIGH is passed then it uses bicubic and box averaging
resampling methods for upsampling and downsampling respectively.

Added the wx.lib.buttonpanel module, which is a tweaked version of
Andrea Gavana's FancyButtonPanel module.

Added the wx.lib.flatnotebook module, from Andrea Gavana.

Renamed wx.FutureCall to wx.CallLater so it is named more like
wx.CallAfter.  wx.FutureCall is now an empty subclass of wx.CallLater
for compatibility of older code.

Added the wx.lib.customtreectrl module from Andrea Gavana.

Added ChangeSelection to wx.BookCtrl (the base class for wx.Notebook
and other book controls) that is the same as SetSelection but doesn't
send the change events.

Added wx.TextCtrl.ChangeValue() which is the same as SetValue() but
doesn't send the text changed event.

For consistency, all classes having an Ok() method now also have
IsOk(), use of the latter form is preferred although the former hasn't
been deprecated yet

Added the wx.AboutBox() function and wx.AboutDialogInfo class.  They
provide a way to show a standard About box for the application, which
will either be a native dialog or a generic one depending on what info
is provided and if it can all be shown with the native dialog.

The code in the animate contrib has been moved into the code wxWidgets
library, and refactored a bit along the way.  For wxPython it still
exists in the wx.animate module, but has basically been reduced to two
classes, wx.animate.Animation, and wx.animate.AnimationCtrl.  You load
the animated GIF (and hopefully there will be other supported formats
in the near future) in the Animation object, and then give that to the
AnimatedCtrl for display.  See the demo for an example.  There is also
still a GIFAnimationCtrl class that provides some level of backwards
compatibility with the old implementation.

wxMac: The compile option that turns on the use of CoreGraphics (a.k.a
Quartz) for wxDC is now turned on by default.  This means that all
drawing via wxDC is done using the new APIs from apple, instead of the
old Quick Draw API.  There are, however, a few places where Quartz and
wxDC don't fit together very well, mainly the lack of support for
logical drawing operations such as XOR, but there is work in progress
to provide other ways to do the same sort of thing that will work with
Quartz and also on the other platforms.

The first parts of a new 2D drawing API has been added with the
wx.GraphicsPath and wx.GraphicsContext classes.  They wrap GDI+ on
Windows, Cairo on wxGTK and CoreGraphics on OS X.  They allow path-based
drawing with alpha-blending and anti-aliasing, and use a floating
point cooridnate system.  Currently they can only target drawing to
windows, but other wx.DC backends are forthcoming.  The APIs may
evolve a bit more before they are finalaized with the 2.8 release, but
there is enough there now to get a good feel for how things will work.
There is also a transitional wx.GCDC class that provides the wx.DC API
on top of wx.GraphicsContext.  Docs and a demo are still MIA.

Added a wx.AutoBufferedPaintDC that is a subclass of wx.PaintDC on
platforms that do double buffering by default, and a subclass of
wx.BufferedPaintDC on the platforms that don't.  You can use this
class to help avoid the overhead of buffering when it is not
needed. There is also a wx.AutoBufferedPaintDCFactory function that
does a little more and actually tests if the window has
double-buffering enabled and then decides whether to return a
wx.PaintDC or wx.BufferedPaintDC.  This uses the new
wx.Window.IsDoubleBuffered method.

Robin Dunn
Software Craftsman  Java give you jitters?  Relax with wxPython!

More information about the Python-announce-list mailing list