90805926b7
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@26380 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
1041 lines
39 KiB
Plaintext
1041 lines
39 KiB
Plaintext
=====================
|
|
The wxPython Manual
|
|
=====================
|
|
|
|
--------------------------------------------
|
|
A guide to wxPython for Python programmers
|
|
--------------------------------------------
|
|
|
|
:Author: Patrick K. O'Brien
|
|
:Contact: pobrien@orbtech.com
|
|
:Organization: Orbtech_
|
|
:Date: $Date$
|
|
:Revision: $Revision$
|
|
:License: wxWindows Free Documentation Licence, Version 3
|
|
|
|
.. _Orbtech: http://www.orbtech.com/
|
|
|
|
.. contents::
|
|
|
|
|
|
Introduction
|
|
============
|
|
|
|
This is a guide to the wxPython GUI toolkit, written **by** a Python
|
|
programmer **for** his fellow Python programmers. It began as a
|
|
simple translation of the wxWidgets documentation (which is written
|
|
for C++ programmers), and evolved from there. And while there's
|
|
nothing wrong with C++...
|
|
|
|
Okay, you got me there. I hate C++. That's why I use Python. If you
|
|
like C++, go read the wxWidgets documentation. If you'd rather read a
|
|
guide that's written with Python programmers in mind, keep reading
|
|
this one. If you like it, feel free to send me freshly roasted coffee
|
|
beans, dark chocolate, and large denomination currency. Better yet,
|
|
buy huge quantities of my wxPython book (written with Robin Dunn) and
|
|
send one to each of your friends, relatives, and coworkers.
|
|
|
|
|
|
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 (native code) that wraps the
|
|
popular wxWidgets cross platform GUI library, which is written in C++.
|
|
|
|
Like Python and wxWidgets, wxPython is Open Source, which means that
|
|
it is free for anyone to use and the source code is available for
|
|
anyone to look at and modify. And anyone can contribute fixes or
|
|
enhnacments to the project.
|
|
|
|
wxPython is a cross-platform toolkit. This means that the same
|
|
program will run on multiple platforms without modification.
|
|
Currently supported platforms are 32-bit Microsoft Windows, most Unix
|
|
or unix-like systems, and Macintosh OS X.
|
|
|
|
Since the language is Python, wxPython programs are simple, easy to
|
|
write and easy to understand.
|
|
|
|
|
|
wxPython requirements
|
|
=====================
|
|
|
|
To make use of wxPython, you currently need one of the following
|
|
setups.
|
|
|
|
MS-Windows
|
|
----------
|
|
|
|
* A 486 or higher PC running MS Windows.
|
|
* At least ?? MB of disk space.
|
|
|
|
Linux or Unix
|
|
-------------
|
|
|
|
* Almost any C++ compiler, including GNU C++ (EGCS 1.1.1 or above).
|
|
* Almost any Unix workstation, and one of: GTK+ 1.2, GTK+ 2.0, Motif
|
|
1.2 or higher, Lesstif.
|
|
* At least ?? MB of disk space.
|
|
|
|
Mac OS X
|
|
--------
|
|
|
|
* A PowerPC Mac running Mac OS X 10.x.
|
|
* At least ?? MB of disk space.
|
|
|
|
|
|
What is wxWidgets?
|
|
==================
|
|
|
|
wxWidgets is a C++ framework providing GUI (Graphical User Interface)
|
|
and other facilities on more than one platform. Version 2 currently
|
|
supports all desktop versions of MS Windows, Unix with GTK+, Unix with
|
|
Motif, and MacOS. An OS/2 port is in progress.
|
|
|
|
wxWidgets was originally developed at the Artificial Intelligence
|
|
Applications Institute, University of Edinburgh, for internal use, and
|
|
was first made publicly available in 1992. Version 2 is a vastly
|
|
improved version written and maintained by Julian Smart, Robert
|
|
Roebling, Vadim Zeitlin, Vaclav Slavik and many others.
|
|
|
|
Please note that in the following, "MS Windows" often refers to all
|
|
platforms related to Microsoft Windows, including 16-bit and 32-bit
|
|
variants, unless otherwise stated. All trademarks are acknowledged.
|
|
|
|
|
|
Why another cross-platform development tool?
|
|
============================================
|
|
|
|
wxWidgets was developed to provide a cheap and flexible way to
|
|
maximize investment in GUI application development. While a number of
|
|
commercial class libraries already existed for cross-platform
|
|
development, none met all of the following criteria:
|
|
|
|
* low price
|
|
* source availability
|
|
* simplicity of programming
|
|
* support for a wide range of compilers
|
|
|
|
Since wxWidgets was started, several other free or almost-free GUI
|
|
frameworks have emerged. However, none has the range of features,
|
|
flexibility, documentation and the well-established development team
|
|
that wxWidgets has.
|
|
|
|
As open source software, wxWidgets has benefited from comments, ideas,
|
|
bug fixes, enhancements and the sheer enthusiasm of users. This gives
|
|
wxWidgets a certain advantage over its commercial competitors (and
|
|
over free libraries without an independent development team), plus a
|
|
robustness against the transience of one individual or company. This
|
|
openness and availability of source code is especially important when
|
|
the future of thousands of lines of application code may depend upon
|
|
the longevity of the underlying class library.
|
|
|
|
Version 2 goes much further than previous versions in terms of
|
|
generality and features, allowing applications to be produced that are
|
|
often indistinguishable from those produced using single-platform
|
|
toolkits such as Motif, GTK+ and MFC.
|
|
|
|
The importance of using a platform-independent class library cannot be
|
|
overstated, since GUI application development is very time-consuming,
|
|
and sustained popularity of particular GUIs cannot be guaranteed.
|
|
Code can very quickly become obsolete if it addresses the wrong
|
|
platform or audience. wxWidgets helps to insulate the programmer from
|
|
these winds of change. Although wxWidgets may not be suitable for
|
|
every application (such as an OLE-intensive program), it provides
|
|
access to most of the functionality a GUI program normally requires,
|
|
plus many extras such as network programming, PostScript output, and
|
|
HTML rendering; and it can of course be extended as needs dictate. As
|
|
a bonus, it provides a far cleaner and easier programming interface
|
|
than the native APIs. Programmers may find it worthwhile to use
|
|
wxWidgets even if they are developing on only one platform.
|
|
|
|
It is impossible to sum up the functionality of wxWidgets in a few
|
|
paragraphs, but here are some of the benefits:
|
|
|
|
* Low cost (free, in fact!)
|
|
* You get the source.
|
|
* Available on a variety of popular platforms.
|
|
* Works with almost all popular C++ compilers and Python.
|
|
* Over 50 example programs.
|
|
* Over 1000 pages of printable and on-line documentation.
|
|
* Includes Tex2RTF, to allow you to produce your own documentation in
|
|
Windows Help, HTML and Word RTF formats.
|
|
* Simple-to-use, object-oriented API.
|
|
* Flexible event system.
|
|
* Graphics calls include lines, rounded rectangles, splines,
|
|
polylines, etc.
|
|
* Constraint-based and sizer-based layouts.
|
|
* Print/preview and document/view architectures.
|
|
* Toolbar, notebook, tree control, advanced list control classes.
|
|
* PostScript generation under Unix, normal MS Windows printing on the
|
|
PC.
|
|
* MDI (Multiple Document Interface) support.
|
|
* Can be used to create DLLs under Windows, dynamic libraries on Unix.
|
|
* Common dialogs for file browsing, printing, colour selection, etc.
|
|
* Under MS Windows, support for creating metafiles and copying them to
|
|
the clipboard.
|
|
* An API for invoking help from applications.
|
|
* Ready-to-use HTML window (supporting a subset of HTML).
|
|
* Dialog Editor for building dialogs.
|
|
* Network support via a family of socket and protocol classes.
|
|
* Support for platform independent image processing.
|
|
* Built-in support for many file formats (BMP, PNG, JPEG, GIF, XPM,
|
|
PNM, PCX).
|
|
|
|
|
|
wxPython Overview
|
|
=================
|
|
|
|
To set a wxPython application going, you will need to derive an App
|
|
class and override App.OnInit.
|
|
|
|
An application must have a top-level Frame or Dialog window. Each
|
|
frame may contain one or more instances of classes such as Panel,
|
|
SplitterWindow or other windows and controls.
|
|
|
|
A frame can have a MenuBar, a ToolBar, a status line, and an Icon for
|
|
when the frame is iconized.
|
|
|
|
A Panel is used to place controls (classes derived from Control) which
|
|
are used for user interaction. Examples of controls are Button,
|
|
CheckBox, Choice, ListBox, RadioBox, Slider.
|
|
|
|
Instances of Dialog can also be used for controls, and they have the
|
|
advantage of not requiring a separate frame.
|
|
|
|
Instead of creating a dialog box and populating it with items, it is
|
|
possible to choose one of the convenient common dialog classes, such
|
|
as MessageDialog and FileDialog.
|
|
|
|
You never draw directly onto a window. Instead, you use a device
|
|
context (DC). DC is the base for ClientDC, PaintDC, MemoryDC,
|
|
PostScriptDC, MemoryDC, MetafileDC and PrinterDC. If your drawing
|
|
functions have DC as a parameter, you can pass any of these DCs to the
|
|
function, and thus use the same code to draw to several different
|
|
devices. You can draw using the member functions of DC, such as
|
|
DC.DrawLine and DC.DrawText. Control colour on a window (Colour) with
|
|
brushes (Brush) and pens (Pen).
|
|
|
|
.. To intercept events, you add a DECLARE_EVENT_TABLE macro to the
|
|
window class declaration, and put a BEGIN_EVENT_TABLE
|
|
... END_EVENT_TABLE block in the implementation file. Between these
|
|
macros, you add event macros which map the event (such as a mouse
|
|
click) to a member function. These might override predefined event
|
|
handlers such as for KeyEvent and MouseEvent.
|
|
|
|
Most modern applications will have an on-line, hypertext help system;
|
|
for this, you need Help and the HelpController class to control
|
|
Help.
|
|
|
|
GUI applications aren't all graphical wizardry. You'll also need
|
|
lists and hash tables. But since you're working with Python, you
|
|
should use the ones Python provides (list, tuple, dict), rather than
|
|
the wxWidgets versions. Same goes for the database related classes.
|
|
The basic rule of thumb is this: If you can do it directly in Python,
|
|
you probably should. If there is a reason not to use a Python data
|
|
type, wxPython will provide a wrapper for the wxWidgets class.
|
|
|
|
You will undoubtedly need some platform-independent file functions,
|
|
and you may find it handy to maintain and search a list of paths using
|
|
PathList. There's a miscellany of operating system and other
|
|
functions.
|
|
|
|
See also Classes by Category for a list of classes.
|
|
|
|
|
|
Utilities and libraries supplied with wxPython
|
|
==============================================
|
|
|
|
In addition to the core wxWidgets library, a number of further
|
|
libraries and utilities are supplied with each distribution.
|
|
|
|
[Need to list these.]
|
|
|
|
|
|
Creating and deleting wxPython objects
|
|
======================================
|
|
|
|
[This section needs to be reviewed.]
|
|
|
|
.. In general, classes derived from wxWindow must dynamically
|
|
allocated with new and deleted with delete. If you delete a window,
|
|
all of its children and descendants will be automatically deleted,
|
|
so you don't need to delete these descendants explicitly.
|
|
|
|
.. When deleting a frame or dialog, use Destroy rather than delete so
|
|
that the wxWidgets delayed deletion can take effect. This waits
|
|
until idle time (when all messages have been processed) to actually
|
|
delete the window, to avoid problems associated with the GUI
|
|
sending events to deleted windows.
|
|
|
|
.. If you decide to allocate a C++ array of objects (such as wxBitmap)
|
|
that may be cleaned up by wxWidgets, make sure you delete the array
|
|
explicitly before wxWidgets has a chance to do so on exit, since
|
|
calling delete on array members will cause memory problems.
|
|
|
|
.. wxColour can be created statically: it is not automatically cleaned
|
|
up and is unlikely to be shared between other objects; it is
|
|
lightweight enough for copies to be made.
|
|
|
|
.. Beware of deleting objects such as a wxPen or wxBitmap if they are
|
|
still in use. Windows is particularly sensitive to this: so make
|
|
sure you make calls like wxDC::SetPen(wxNullPen) or
|
|
wxDC::SelectObject(wxNullBitmap) before deleting a drawing object
|
|
that may be in use. Code that doesn't do this will probably work
|
|
fine on some platforms, and then fail under Windows.
|
|
|
|
|
|
App overview
|
|
============
|
|
|
|
Classes: wx.App
|
|
|
|
Application initialization
|
|
--------------------------
|
|
|
|
The OnInit method defined for a class derived from wx.App will usually
|
|
create a top window as a bare minimum.
|
|
|
|
OnInit must return a boolean value to indicate whether processing
|
|
should continue (True) or not (False). You call App.SetTopWindow to
|
|
let wxPython know about the top window.
|
|
|
|
An application closes by destroying all windows. Because all frames
|
|
must be destroyed for the application to exit, it is advisable to use
|
|
parent frames wherever possible when creating new frames, so that
|
|
deleting the top level frame will automatically delete child frames.
|
|
The alternative is to explicitly delete child frames in the top-level
|
|
frame's CloseEvent handler.
|
|
|
|
In emergencies the wx.Exit() function can be called to kill the
|
|
application, however, normally the application shuts down
|
|
automatically, see below.
|
|
|
|
An example of defining an application follows::
|
|
|
|
import wx
|
|
|
|
from frame import Frame
|
|
|
|
class App(wx.App):
|
|
"""Application class."""
|
|
|
|
def OnInit(self):
|
|
self.frame = Frame()
|
|
self.frame.Show()
|
|
self.SetTopWindow(self.frame)
|
|
return True
|
|
|
|
def main():
|
|
app = App()
|
|
app.MainLoop()
|
|
|
|
if __name__ == '__main__':
|
|
main()
|
|
|
|
|
|
Application shutdown
|
|
--------------------
|
|
|
|
The application normally shuts down when the last of its top level
|
|
windows is closed. This is normally the expected behaviour and means
|
|
that it is enough to call Close() in response to the "Exit" menu
|
|
command if your program has a single top level window. If this
|
|
behaviour is not desirable, App.SetExitOnFrameDelete can be called to
|
|
change it. Note that such logic doesn't apply for the windows shown
|
|
before the program enters the main loop: in other words, you can
|
|
safely show a dialog from App.OnInit and not be afraid that your
|
|
application terminates when this dialog -- which is the last top level
|
|
window for the moment -- is closed.
|
|
|
|
Another aspect of the application shutdown is the OnExit which is
|
|
called when the application exits but before wxPython cleans up its
|
|
internal structures. You should delete all wxPython objects that you
|
|
created by the time OnExit finishes.
|
|
|
|
For example, this code may crash:
|
|
|
|
[Need examples of objects needing cleanup to keep app from crashing.]
|
|
|
|
|
|
Sizer overview
|
|
==============
|
|
|
|
Classes: wx.Sizer, wx.GridSizer, wx.FlexGridSizer, wx.BoxSizer,
|
|
wx.StaticBoxSizer, wx.NotebookSizer, wx.CreateButtonSizer
|
|
|
|
============== ======================================================
|
|
|
|
Sizer Abstract base class.
|
|
|
|
GridSizer A sizer for laying out windows in a grid with all
|
|
fields having the same size.
|
|
|
|
FlexGridSizer A sizer for laying out windows in a flexible grid.
|
|
|
|
BoxSizer A sizer for laying out windows in a row or column.
|
|
|
|
StaticBoxSizer Same as BoxSizer, but with a surrounding static box.
|
|
|
|
NotebookSizer Sizer to use with the Notebook control.
|
|
|
|
============== ======================================================
|
|
|
|
Sizers, as represented by the wx.Sizer class and its descendants in
|
|
the wxPython class hierarchy, have become the method of choice to
|
|
define the layout of controls in dialogs in wxPython because of their
|
|
ability to create visually appealing dialogs independent of the
|
|
platform, taking into account the differences in size and style of the
|
|
individual controls. Editors such as wxDesigner, wxrcedit, XRCed and
|
|
wxWorkshop create dialogs based exclusively on sizers, practically
|
|
forcing the user to create platform independent layouts without
|
|
compromises.
|
|
|
|
|
|
The idea behind sizers
|
|
----------------------
|
|
|
|
The layout algorithm used by sizers in wxPython is closely related to
|
|
layout systems in other GUI toolkits, such as Java's AWT, the GTK
|
|
toolkit or the Qt toolkit. It is based upon the idea of individual
|
|
subwindows reporting their minimal required size and their ability to
|
|
get stretched if the size of the parent window has changed. This will
|
|
most often mean that the programmer does not set the start-up size of
|
|
a dialog, the dialog will rather be assigned a sizer and this sizer
|
|
will be queried about the recommended size. This sizer in turn will
|
|
query its children (which can be normal windows, empty space or other
|
|
sizers) so that a hierarchy of sizers can be constructed. Note that
|
|
wx.Sizer does not derive from wx.Window and thus does not interfere
|
|
with tab ordering and requires very few resources compared to a real
|
|
window on screen.
|
|
|
|
What makes sizers so well fitted for use in wxPython is the fact that
|
|
every control reports its own minimal size and the algorithm can
|
|
handle differences in font sizes or different window (dialog item)
|
|
sizes on different platforms without problems. For example, if the
|
|
standard font as well as the overall design of Linux/GTK widgets
|
|
requires more space than on Windows, the initial dialog size will
|
|
automatically be bigger on Linux/GTK than on Windows.
|
|
|
|
There are currently five different kinds of sizers available in
|
|
wxPython. Each represents either a certain way to lay out dialog items
|
|
in a dialog or it fulfils a special task such as wrapping a static box
|
|
around a dialog item (or another sizer). These sizers will be
|
|
discussed one by one in the text below.
|
|
|
|
|
|
Common features
|
|
---------------
|
|
|
|
All sizers are containers, that is, they are used to lay out one
|
|
dialog item (or several dialog items), which they contain. Such items
|
|
are sometimes referred to as the children of the sizer. Independent
|
|
of how the individual sizers lay out their children, all children have
|
|
certain features in common:
|
|
|
|
|
|
A minimal size
|
|
~~~~~~~~~~~~~~
|
|
|
|
This minimal size is usually identical to the initial size of the
|
|
controls and may either be set explicitly in the size field of the
|
|
control constructor or may be calculated by wxPython, typically by
|
|
setting the height and/or the width of the item to -1. Note that only
|
|
some controls can calculate their size (such as a checkbox) whereas
|
|
others (such as a listbox) don't have any natural width or height and
|
|
thus require an explicit size. Some controls can calculate their
|
|
height, but not their width (e.g. a single line text control):
|
|
|
|
[Need graphics]
|
|
|
|
|
|
A border
|
|
~~~~~~~~
|
|
|
|
The border is just empty space and is used to separate dialog items in
|
|
a dialog. This border can either be all around, or at any combination
|
|
of sides such as only above and below the control. The thickness of
|
|
this border must be set explicitly, typically 5 points. The following
|
|
samples show dialogs with only one dialog item (a button) and a border
|
|
of 0, 5, and 10 pixels around the button:
|
|
|
|
[Need graphics]
|
|
|
|
|
|
An alignment
|
|
~~~~~~~~~~~~
|
|
|
|
Often, a dialog item is given more space than its minimal size plus
|
|
its border. Depending on what flags are used for the respective dialog
|
|
item, the dialog item can be made to fill out the available space
|
|
entirely, i.e. it will grow to a size larger than the minimal size, or
|
|
it will be moved to either the centre of the available space or to
|
|
either side of the space. The following sample shows a listbox and
|
|
three buttons in a horizontal box sizer; one button is centred, one is
|
|
aligned at the top, one is aligned at the bottom:
|
|
|
|
[Need graphics]
|
|
|
|
|
|
A stretch factor
|
|
~~~~~~~~~~~~~~~~
|
|
|
|
If a sizer contains more than one child and it is offered more space
|
|
than its children and their borders need, the question arises how to
|
|
distribute the surplus space among the children. For this purpose, a
|
|
stretch factor may be assigned to each child, where the default value
|
|
of 0 indicates that the child will not get more space than its
|
|
requested minimum size. A value of more than zero is interpreted in
|
|
relation to the sum of all stretch factors in the children of the
|
|
respective sizer, i.e. if two children get a stretch factor of 1, they
|
|
will get half the extra space each independent of whether one control
|
|
has a minimal sizer inferior to the other or not. The following
|
|
sample shows a dialog with three buttons, the first one has a stretch
|
|
factor of 1 and thus gets stretched, whereas the other two buttons
|
|
have a stretch factor of zero and keep their initial width:
|
|
|
|
[Need graphics]
|
|
|
|
Within wxDesigner, this stretch factor gets set from the Option menu.
|
|
|
|
|
|
BoxSizer
|
|
--------
|
|
|
|
BoxSizer can lay out its children either vertically or horizontally,
|
|
depending on what flag is being used in its constructor. When using a
|
|
vertical sizer, each child can be centered, aligned to the right or
|
|
aligned to the left. Correspondingly, when using a horizontal sizer,
|
|
each child can be centered, aligned at the bottom or aligned at the
|
|
top. The stretch factor described in the last paragraph is used for
|
|
the main orientation, i.e. when using a horizontal box sizer, the
|
|
stretch factor determines how much the child can be stretched
|
|
horizontally. The following sample shows the same dialog as in the
|
|
last sample, only the box sizer is a vertical box sizer now:
|
|
|
|
[Need graphics]
|
|
|
|
|
|
StaticBoxSizer
|
|
--------------
|
|
|
|
StaticBoxSixer is the same as a BoxSizer, but surrounded by a static
|
|
box. Here is a sample:
|
|
|
|
[Need graphics]
|
|
|
|
|
|
GridSizer
|
|
---------
|
|
|
|
GridSizer is a two-dimensional sizer. All children are given the same
|
|
size, which is the minimal size required by the biggest child, in this
|
|
case the text control in the left bottom border. Either the number of
|
|
columns or the number or rows is fixed and the grid sizer will grow in
|
|
the respectively other orientation if new children are added:
|
|
|
|
[Need graphics]
|
|
|
|
|
|
FlexGridSizer
|
|
-------------
|
|
|
|
Another two-dimensional sizer derived from GridSizer. The width of
|
|
each column and the height of each row are calculated individually
|
|
according the minimal requirements from the respectively biggest
|
|
child. Additionally, columns and rows can be declared to be
|
|
stretchable if the sizer is assigned a size different from that which
|
|
it requested. The following sample shows the same dialog as the one
|
|
above, but using a flex grid sizer:
|
|
|
|
[Need graphics]
|
|
|
|
|
|
NotebookSizer
|
|
-------------
|
|
|
|
NotebookSizer can be used with notebooks. It calculates the size of
|
|
each notebook page and sets the size of the notebook to the size of
|
|
the biggest page plus some extra space required for the notebook tabs
|
|
and decorations.
|
|
|
|
[Need graphics]
|
|
|
|
|
|
Programming with BoxSizer
|
|
-------------------------
|
|
|
|
The basic idea behind a BoxSizer is that windows will most often be
|
|
laid out in rather simple basic geometry, typically in a row or a
|
|
column or several hierarchies of either.
|
|
|
|
As an example, we will construct a dialog that will contain a text
|
|
field at the top and two buttons at the bottom. This can be seen as a
|
|
top-hierarchy column with the text at the top and buttons at the
|
|
bottom and a low-hierarchy row with an OK button to the left and a
|
|
Cancel button to the right. In many cases (particularly dialogs under
|
|
Unix and normal frames) the main window will be resizable by the user
|
|
and this change of size will have to get propagated to its children.
|
|
In our case, we want the text area to grow with the dialog, whereas
|
|
the button shall have a fixed size. In addition, there will be a thin
|
|
border around all controls to make the dialog look nice and - to make
|
|
matter worse - the buttons shall be centred as the width of the dialog
|
|
changes.
|
|
|
|
It is the unique feature of a box sizer, that it can grow in both
|
|
directions (height and width) but can distribute its growth in the
|
|
main direction (horizontal for a row) unevenly among its children. In
|
|
our example case, the vertical sizer is supposed to propagate all its
|
|
height changes to only the text area, not to the button area. This is
|
|
determined by the proportion parameter when adding a window (or
|
|
another sizer) to a sizer. It is interpreted as a weight factor,
|
|
i.e. it can be zero, indicating that the window may not be resized at
|
|
all, or above zero. If several windows have a value above zero, the
|
|
value is interpreted relative to the sum of all weight factors of the
|
|
sizer, so when adding two windows with a value of 1, they will both
|
|
get resized equally much and each half as much as the sizer owning
|
|
them.
|
|
|
|
Then what do we do when a column sizer changes its width? This
|
|
behaviour is controlled by flags (the second parameter of the Add()
|
|
function): zero or no flag indicates that the window will preserve it
|
|
is original size, wx.GROW flag (same as wx.EXPAND) forces the window
|
|
to grow with the sizer, and wx.SHAPED flag tells the window to change
|
|
it is size proportionally, preserving original aspect ratio. When
|
|
wx.GROW flag is not used, the item can be aligned within available
|
|
space. wx.ALIGN_LEFT, wx.ALIGN_TOP, wx.ALIGN_RIGHT, wx.ALIGN_BOTTOM,
|
|
wx.ALIGN_CENTER_HORIZONTAL and wx.ALIGN_CENTER_VERTICAL do what they
|
|
say. wx.ALIGN_CENTRE (same as wx.ALIGN_CENTER) is defined as
|
|
(``wx.ALIGN_CENTER_HORIZONTAL | wx.ALIGN_CENTER_VERTICAL``). Default
|
|
alignment is ``wx.ALIGN_LEFT | wx.ALIGN_TOP``.
|
|
|
|
As mentioned above, any window belonging to a sizer may have border,
|
|
and it can be specified which of the four sides may have this border,
|
|
using the wx.TOP, wx.LEFT, wx.RIGHT and wx.BOTTOM constants or wx.ALL
|
|
for all directions (and you may also use wx.NORTH, wx.WEST etc
|
|
instead). These flags can be used in combination with the alignment
|
|
flags above as the second parameter of the Add() method using the
|
|
binary or operator (``|``). The sizer of the border also must be made
|
|
known, and it is the third parameter in the Add() method. This means,
|
|
that the entire behaviour of a sizer and its children can be
|
|
controlled by the three parameters of the Add() method.
|
|
|
|
[Show code and graphic here.]
|
|
|
|
|
|
Programming with GridSizer
|
|
--------------------------
|
|
|
|
GridSizer is a sizer which lays out its children in a two-dimensional
|
|
table with all table fields having the same size, i.e. the width of
|
|
each field is the width of the widest child, the height of each field
|
|
is the height of the tallest child.
|
|
|
|
[Show code and graphic here.]
|
|
|
|
|
|
Programming with FlexGridSizer
|
|
------------------------------
|
|
|
|
FlexGridSizer is a sizer which lays out its children in a
|
|
two-dimensional table with all table fields in one row having the same
|
|
height and all fields in one column having the same width, but all
|
|
rows or all columns are not necessarily the same height or width as in
|
|
the GridSizer.
|
|
|
|
[Show code and graphic here.]
|
|
|
|
|
|
Programming with NotebookSizer
|
|
------------------------------
|
|
|
|
NotebookSizer is a specialized sizer to make sizers work in connection
|
|
with using notebooks. This sizer is different from any other sizer as
|
|
you must not add any children to it - instead, it queries the notebook
|
|
class itself. The only thing this sizer does is to determine the size
|
|
of the biggest page of the notebook and report an adjusted minimal
|
|
size to a more toplevel sizer.
|
|
|
|
In order to query the size of notebook page, this page needs to have
|
|
its own sizer, otherwise the NotebookSizer will ignore it. Notebook
|
|
pages get their sizer by assigning one to them using SetSizer() and
|
|
setting the auto-layout option to True using SetAutoLayout(). Here is
|
|
one example showing how to add a notebook page that the notebook sizer
|
|
is aware of:
|
|
|
|
[Show code and graphic here.]
|
|
|
|
|
|
Programming with StaticBoxSizer
|
|
-------------------------------
|
|
|
|
StaticBoxSizer is a sizer derived from BoxSizer but adds a static box
|
|
around the sizer. Note that this static box has to be created
|
|
separately.
|
|
|
|
[Show code and graphic here.]
|
|
|
|
|
|
Dialog.CreateButtonSizer
|
|
------------------------
|
|
|
|
As a convenience, the Dialog class has a CreateButtonSizer(flags)
|
|
method that can be used to create a standard button sizer in which
|
|
standard buttons are displayed. The following flags can be passed to
|
|
this method:
|
|
|
|
============= =======================================================
|
|
wx.YES_NO add Yes/No subpanel
|
|
wx.YES return wx.ID_YES
|
|
wx.NO return wx.ID_NO
|
|
wx.NO_DEFAULT make the wx.NO button the default, otherwise wx.YES or
|
|
wx.OK button will be default
|
|
wx.OK return wx.ID_OK
|
|
wx.CANCEL return wx.ID_CANCEL
|
|
wx.HELP return wx.ID_HELP
|
|
wx.FORWARD return wx.ID_FORWARD
|
|
wx.BACKWARD return wx.ID_BACKWARD
|
|
wx.SETUP return wx.ID_SETUP
|
|
wx.MORE return wx.ID_MORE
|
|
============= =======================================================
|
|
|
|
|
|
Date and time classes overview
|
|
==============================
|
|
|
|
wxPython provides a set of powerful classes to work with dates and
|
|
times. Some of the supported features of the DateTime class are:
|
|
|
|
============= =======================================================
|
|
|
|
Wide range The range of supported dates goes from about 4714 B.C. to
|
|
some 480 million years in the future.
|
|
|
|
Precision Not using floating point calculations anywhere ensures that
|
|
the date calculations don't suffer from rounding
|
|
errors.
|
|
|
|
Many features Not only all usual calculations with dates are
|
|
supported, but also more exotic week and year day
|
|
calculations, work day testing, standard astronomical
|
|
functions, conversion to and from strings in either
|
|
strict or free format.
|
|
|
|
|
|
Efficiency Objects of DateTime are small (8 bytes) and working
|
|
with them is fast
|
|
|
|
============= =======================================================
|
|
|
|
|
|
All date/time classes at a glance
|
|
---------------------------------
|
|
|
|
There are 3 main classes: except DateTime itself which represents an
|
|
absolute moment in time, there are also two classes - TimeSpan and
|
|
DateSpan which represent the intervals of time.
|
|
|
|
There are also helper classes which are used together with DateTime:
|
|
DateTimeHolidayAuthority which is used to determine whether a given
|
|
date is a holiday or not and DateTimeWorkDays which is a derivation of
|
|
this class for which (only) Saturdays and Sundays are the holidays.
|
|
See more about these classes in the discussion of the holidays.
|
|
|
|
|
|
DateTime characteristics
|
|
------------------------
|
|
|
|
DateTime stores the time as a signed number of milliseconds since the
|
|
Epoch which is fixed, by convention, to Jan 1, 1970 - however this is
|
|
not visible to the class users (in particular, dates prior to the
|
|
Epoch are handled just as well (or as bad) as the dates after it).
|
|
But it does mean that the best resolution which can be achieved with
|
|
this class is 1 millisecond.
|
|
|
|
The size of DateTime object is 8 bytes because it is represented as a
|
|
64 bit integer. The resulting range of supported dates is thus
|
|
approximatively 580 million years, but due to the current limitations
|
|
in the Gregorian calendar support, only dates from Nov 24, 4714BC are
|
|
supported (this is subject to change if there is sufficient interest
|
|
in doing it).
|
|
|
|
Finally, the internal representation is time zone independent (always
|
|
in GMT) and the time zones only come into play when a date is broken
|
|
into year/month/day components. See more about timezones below.
|
|
|
|
Currently, the only supported calendar is Gregorian one (which is used
|
|
even for the dates prior to the historic introduction of this calendar
|
|
which was first done on Oct 15, 1582 but is, generally speaking,
|
|
country, and even region, dependent). Future versions will probably
|
|
have Julian calendar support as well and support for other calendars
|
|
(Maya, Hebrew, Chinese...) is not ruled out.
|
|
|
|
|
|
Difference between DateSpan and TimeSpan
|
|
----------------------------------------
|
|
|
|
While there is only one logical way to represent an absolute moment in
|
|
the time (and hence only one DateTime class), there are at least two
|
|
methods to describe a time interval.
|
|
|
|
First, there is the direct and self-explaining way implemented by
|
|
TimeSpan: it is just a difference in milliseconds between two moments
|
|
in time. Adding or subtracting such an interval to DateTime is always
|
|
well-defined and is a fast operation.
|
|
|
|
But in daily life other, calendar-dependent time interval
|
|
specifications are used. For example, 'one month later' is commonly
|
|
used. However, it is clear that this is not the same as TimeSpan of
|
|
60*60*24*31 seconds because 'one month later' Feb 15 is Mar 15 and not
|
|
Mar 17 or Mar 16 (depending on whether the year is leap or not).
|
|
|
|
This is why there is another class for representing such intervals
|
|
called DateSpan. It handles these sort of operations in the most
|
|
natural way possible, but note that manipulating with intervals of
|
|
this kind is not always well-defined. Consider, for example, Jan 31 +
|
|
'1 month': this will give Feb 28 (or 29), i.e. the last day of
|
|
February and not the non-existent Feb 31. Of course, this is what is
|
|
usually wanted, but you still might be surprised to notice that now
|
|
subtracting back the same interval from Feb 28 will result in Jan 28
|
|
and not Jan 31 we started with!
|
|
|
|
So, unless you plan to implement some kind of natural language parsing
|
|
in the program, you should probably use TimeSpan instead of DateSpan
|
|
(which is also more efficient). However, DateSpan may be very useful
|
|
in situations when you do need to understand what 'in a month' means
|
|
(of course, it is just DateTime.Now() + DateSpan.Month()).
|
|
|
|
|
|
Date arithmetics
|
|
----------------
|
|
|
|
Many different operations may be performed with the dates, however not
|
|
all of them make sense. For example, multiplying a date by a number
|
|
is an invalid operation, even though multiplying either of the time
|
|
span classes by a number is perfectly valid.
|
|
|
|
Here is what can be done:
|
|
|
|
============== ======================================================
|
|
|
|
Addition a TimeSpan or DateSpan can be added to DateTime resulting in
|
|
a new DateTime object and also 2 objects of the same
|
|
span class can be added together giving another object
|
|
of the same class.
|
|
|
|
|
|
Subtraction the same types of operations as above are allowed and,
|
|
additionally, a difference between two DateTime
|
|
objects can be taken and this will yield TimeSpan.
|
|
|
|
Multiplication a TimeSpan or DateSpan object can be multiplied by an
|
|
integer number resulting in an object of the same
|
|
type.
|
|
|
|
|
|
Unary minus a TimeSpan or DateSpan object may finally be negated
|
|
giving an interval of the same magnitude but of
|
|
opposite time direction.
|
|
|
|
============== ======================================================
|
|
|
|
|
|
Time zone considerations
|
|
------------------------
|
|
|
|
Although the time is always stored internally in GMT, you will usually
|
|
work in the local time zone. Because of this, all DateTime
|
|
constructors and setters which take the broken down date assume that
|
|
these values are for the local time zone. Thus, DateTime(1,
|
|
DateTime.Jan, 1970) will not correspond to the DateTime Epoch unless
|
|
you happen to live in the UK.
|
|
|
|
All methods returning the date components (year, month, day, hour,
|
|
minute, second...) will also return the correct values for the local
|
|
time zone by default. So, generally, doing the natural things will
|
|
lead to natural and correct results.
|
|
|
|
If you only want to do this, you may safely skip the rest of this
|
|
section. However, if you want to work with different time zones, you
|
|
should read it to the end.
|
|
|
|
In this (rare) case, you are still limited to the local time zone when
|
|
constructing DateTime objects, i.e. there is no way to construct a
|
|
DateTime corresponding to the given date in, say, Pacific Standard
|
|
Time. To do it, you will need to call ToTimezone or MakeTimezone
|
|
methods to adjust the date for the target time zone. There are also
|
|
special versions of these functions ToGMT and MakeGMT for the most
|
|
common case - when the date should be constructed in GMT.
|
|
|
|
You also can just retrieve the value for some time zone without
|
|
converting the object to it first. For this you may pass TimeZone
|
|
argument to any of the methods which are affected by the time zone
|
|
(all methods getting date components and the date formatting ones, for
|
|
example). In particular, the Format() family of methods accepts a
|
|
TimeZone parameter and this allows to simply print time in any time
|
|
zone.
|
|
|
|
To see how to do it, the last issue to address is how to construct a
|
|
TimeZone object which must be passed to all these methods. First of
|
|
all, you may construct it manually by specifying the time zone offset
|
|
in seconds from GMT, but usually you will just use one of the symbolic
|
|
time zone names and let the conversion constructor do the
|
|
job. I.e. you would just write
|
|
|
|
wxDateTime dt(...whatever...);
|
|
printf("The time is %s in local time zone", dt.FormatTime().c_str());
|
|
printf("The time is %s in GMT", dt.FormatTime(wxDateTime::GMT).c_str());
|
|
|
|
|
|
Daylight saving time (DST)
|
|
--------------------------
|
|
|
|
DST (a.k.a. 'summer time') handling is always a delicate task which is
|
|
better left to the operating system which is supposed to be configured
|
|
by the administrator to behave correctly. Unfortunately, when doing
|
|
calculations with date outside of the range supported by the standard
|
|
library, we are forced to deal with these issues ourselves.
|
|
|
|
Several functions are provided to calculate the beginning and end of
|
|
DST in the given year and to determine whether it is in effect at the
|
|
given moment or not, but they should not be considered as absolutely
|
|
correct because, first of all, they only work more or less correctly
|
|
for only a handful of countries (any information about other ones
|
|
appreciated!) and even for them the rules may perfectly well change in
|
|
the future.
|
|
|
|
The time zone handling methods use these functions too, so they are
|
|
subject to the same limitations.
|
|
|
|
|
|
DateTime and Holidays
|
|
---------------------
|
|
|
|
[TODO]
|
|
|
|
|
|
Classes by category
|
|
===================
|
|
|
|
Not done yet.
|
|
|
|
|
|
ID constants
|
|
============
|
|
|
|
wxPython provides the following predefined ID constants:
|
|
|
|
ID_ABORT
|
|
ID_ABOUT
|
|
ID_ANY
|
|
ID_APPLY
|
|
ID_BACKWARD
|
|
ID_CANCEL
|
|
ID_CLEAR
|
|
ID_CLOSE
|
|
ID_CLOSE_ALL
|
|
ID_CONTEXT_HELP
|
|
ID_COPY
|
|
ID_CUT
|
|
ID_DEFAULT
|
|
ID_DUPLICATE
|
|
ID_EXIT
|
|
ID_FILE1
|
|
ID_FILE2
|
|
ID_FILE3
|
|
ID_FILE4
|
|
ID_FILE5
|
|
ID_FILE6
|
|
ID_FILE7
|
|
ID_FILE8
|
|
ID_FILE9
|
|
ID_FILTERLISTCTRL
|
|
ID_FIND
|
|
ID_FORWARD
|
|
ID_HELP
|
|
ID_HELP_COMMANDS
|
|
ID_HELP_CONTENTS
|
|
ID_HELP_CONTEXT
|
|
ID_HELP_PROCEDURES
|
|
ID_IGNORE
|
|
ID_MORE
|
|
ID_NEW
|
|
ID_NO
|
|
ID_NOTOALL
|
|
ID_OK
|
|
ID_OPEN
|
|
ID_PASTE
|
|
ID_PREVIEW
|
|
ID_PRINT
|
|
ID_PRINT_SETUP
|
|
ID_REDO
|
|
ID_RESET
|
|
ID_RETRY
|
|
ID_REVERT
|
|
ID_SAVE
|
|
ID_SAVEAS
|
|
ID_SELECTALL
|
|
ID_SEPARATOR
|
|
ID_SETUP
|
|
ID_STATIC
|
|
ID_TREECTRL
|
|
ID_UNDO
|
|
ID_YES
|
|
ID_YESTOALL
|
|
|
|
|
|
Source document
|
|
===============
|
|
|
|
The source document is named wxPythonManual.txt and can be found by
|
|
clicking the link at the bottom of this page (assuming you are viewing
|
|
the html file). It is written using a fantastic formatting convention
|
|
called reStructuredText. The wxPythonManual.html file is created
|
|
using the Docutils utilities, which can turn reStructuredText
|
|
documents into html, xml, pdf, and even OpenOffice files.
|
|
|
|
|
|
Submitting changes to the source document
|
|
=========================================
|
|
|
|
Some items in the source text file look like this::
|
|
|
|
.. This is text from the wxWidgets documentation that needs to be
|
|
translated into something appropriate for the wxPython version.
|
|
The two dots followed by uniformly indented text turns this
|
|
paragraph into a reStructuredText comment, so it doesn't appear
|
|
in any output file, such as the html file.
|
|
|
|
They have been commented out and are awaiting editorial review and a
|
|
rewrite so that they make sense in the context of wxPython. Feel free
|
|
to send me suggestions for rewording these, or any other parts of this
|
|
document that you think need improving. I will be eternally grateful
|
|
to you and will show my gratitude by adding your name to the list of
|
|
contributors. (Contributors who also send me gifts of coffee,
|
|
chocolate, or currency will have their names listed in bold.)
|
|
|
|
|
|
Contributors
|
|
============
|
|
|
|
Individuals who contributed to this documentation (in order by last
|
|
name):
|
|
|
|
* Robin Dunn
|
|
* Patrick K. O'Brien
|
|
* Robert Roebling
|
|
* Julian Smart
|
|
* Vadim Zeitlin
|
|
|
|
|
|
License
|
|
=======
|
|
|
|
This document began as a translation of the wxWidgets documentation.
|
|
As such, it adheres to the same license, which is provided here:
|
|
|
|
.. include:: ../licence/licendoc.txt
|
|
:literal:
|