]> git.saurik.com Git - wxWidgets.git/blame - docs/latex/wx/wxPython.tex
Some work on GTK focus handling and events.
[wxWidgets.git] / docs / latex / wx / wxPython.tex
CommitLineData
bd330a69
JS
1\section{wxPython overview}\label{wxpython}
2%\setheader{{\it CHAPTER \thechapter}}{}{}{}{}{{\it CHAPTER \thechapter}}%
3%\setfooter{\thepage}{}{}{}{}{\thepage}%
605d715d 4
bd330a69 5This topic was written by Robin Dunn, author of the wxPython wrapper.
2a47d3c1 6
06d20283 7%----------------------------------------------------------------------
bd330a69 8\subsection{What is wxPython?}\label{wxpwhat}
06d20283 9
f899db6d 10wxPython is a blending of the wxWindows GUI classes and the
06d20283
RD
11\urlref{Python}{http://www.python.org/} programming language.
12
13\wxheading{Python}
14
76e1c2de 15So what is Python? Go to
7e9a386e
JS
16\urlref{http://www.python.org}{http://www.python.org} to learn more,
17but in a nutshell Python is an interpreted,
06d20283
RD
18interactive, object-oriented programming language. It is often
19compared to Tcl, Perl, Scheme or Java.
20
21Python combines remarkable power with very clear syntax. It has
22modules, classes, exceptions, very high level dynamic data types, and
23dynamic typing. There are interfaces to many system calls and
24libraries, and new built-in modules are easily written in C or
25C++. Python is also usable as an extension language for applications
26that need a programmable interface.
27
28Python is copyrighted but freely usable and distributable, even for
29commercial use.
30
31\wxheading{wxPython}
32
33wxPython is a Python package that can be imported at runtime that
34includes a collection of Python modules and an extension module
7e9a386e
JS
35(native code). It provides a series of Python classes that mirror (or
36shadow) many of the wxWindows GUI classes. This extension module
c9f00eeb 37attempts to mirror the class heirarchy of wxWindows as closely as
f6bcfd97 38possible. This means that there is a wxFrame class in wxPython that
06d20283
RD
39looks, smells, tastes and acts almost the same as the wxFrame class in
40the C++ version.
41
7e9a386e 42wxPython is very versitile. It can be used to create standalone GUI
06d20283
RD
43applications, or in situations where Python is embedded in a C++
44application as an internal scripting or macro language.
45
46Currently wxPython is available for Win32 platforms and the GTK
c9f00eeb
RD
47toolkit (wxGTK) on most Unix/X-windows platforms. See the wxPython
48website \urlref{http://wxPython.org/}{http://wxPython.org/} for
2a47d3c1 49details about getting wxPython working for you.
06d20283 50
06d20283 51%----------------------------------------------------------------------
bd330a69 52\subsection{Why use wxPython?}\label{wxpwhy}
06d20283 53
06d20283 54So why would you want to use wxPython over just C++ and wxWindows?
c9f00eeb
RD
55Personally I prefer using Python for everything. I only use C++ when I
56absolutely have to eek more performance out of an algorithm, and even
f6bcfd97 57then I usually code it as an extension module and leave the majority
06d20283
RD
58of the program in Python.
59
60Another good thing to use wxPython for is quick prototyping of your
7e9a386e
JS
61wxWindows apps. With C++ you have to continuously go though the
62edit-compile-link-run cycle, which can be quite time consuming. With
63Python it is only an edit-run cycle. You can easily build an
06d20283 64application in a few hours with Python that would normally take a few
7e9a386e 65days or longer with C++. Converting a wxPython app to a C++/wxWindows app
06d20283
RD
66should be a straight forward task.
67
06d20283 68%----------------------------------------------------------------------
bd330a69 69\subsection{Other Python GUIs}\label{wxpother}
06d20283
RD
70
71There are other GUI solutions out there for Python.
72
73\wxheading{Tkinter}
74
7e9a386e
JS
75Tkinter is the defacto standard GUI for Python. It is available
76on nearly every platform that Python and Tcl/TK are. Why Tcl/Tk?
06d20283
RD
77Well because Tkinter is just a wrapper around Tcl's GUI toolkit, Tk.
78This has its upsides and its downsides...
79
7e9a386e
JS
80The upside is that Tk is a pretty versatile toolkit. It can be made
81to do a lot of things in a lot of different environments. It is fairly
f6bcfd97 82easy to create new widgets and use them interchangeably in your
06d20283
RD
83programs.
84
7e9a386e 85The downside is Tcl. When using Tkinter you actually have two
06d20283 86separate language interpreters running, the Python interpreter and the
7e9a386e
JS
87Tcl interpreter for the GUI. Since the guts of Tcl is mostly about
88string processing, it is fairly slow as well. (Not too bad on a fast
06d20283
RD
89Pentium II, but you really notice the difference on slower machines.)
90
f6bcfd97 91It wasn't until the latest version of Tcl/Tk that native Look and
7e9a386e
JS
92Feel was possible on non-Motif platforms. This is because Tk
93usually implements its own widgets (controls) even when there are
06d20283
RD
94native controls available.
95
7e9a386e 96Tkinter is a pretty low-level toolkit. You have to do a lot of work
06d20283
RD
97(verbose program code) to do things that would be much simpler with a higher
98level of abstraction.
99
100\wxheading{PythonWin}
101
7e9a386e
JS
102PythonWin is an add-on package for Python for the Win32 platform. It
103includes wrappers for MFC as well as much of the Win32 API. Because
06d20283 104of its foundation, it is very familiar for programmers who have
7e9a386e
JS
105experience with MFC and the Win32 API. It is obviously not compatible
106with other platforms and toolkits. PythonWin is organized as separate
06d20283
RD
107packages and modules so you can use the pieces you need without having
108to use the GUI portions.
109
110\wxheading{Others}
111
112There are quite a few other GUI modules available for Python, some in
f6bcfd97 113active use, some that haven't been updated for ages. Most are simple
06d20283 114wrappers around some C or C++ toolkit or another, and most are not
f6bcfd97 115cross-platform compatible. See \urlref{this link}{http://www.python.org/download/Contributed.html\#Graphics}
06d20283
RD
116for a listing of a few of them.
117
06d20283 118%----------------------------------------------------------------------
bd330a69 119\subsection{Using wxPython}\label{wxpusing}
06d20283
RD
120
121\wxheading{First things first...}
122
7e9a386e 123I'm not going to try and teach the Python language here. You can do
06d20283
RD
124that at the \urlref{Python Tutorial}{http://www.python.org/doc/tut/tut.html}.
125I'm also going to assume that you know a bit about wxWindows already,
126enough to notice the similarities in the classes used.
127
7e9a386e 128Take a look at the following wxPython program. You can find a similar
c9110876 129program in the {\tt wxPython/demo} directory, named {\tt DialogUnits.py}. If your
06d20283
RD
130Python and wxPython are properly installed, you should be able to run
131it by issuing this command:
132
133\begin{indented}{1cm}
605d715d 134 {\bf\tt python DialogUnits.py}
06d20283
RD
135\end{indented}
136
137\hrule
138
139\begin{verbatim}
140001: ## import all of the wxPython GUI package
141002: from wxPython.wx import *
142003:
143004: ## Create a new frame class, derived from the wxPython Frame.
144005: class MyFrame(wxFrame):
145006:
146007: def __init__(self, parent, id, title):
147008: # First, call the base class' __init__ method to create the frame
148009: wxFrame.__init__(self, parent, id, title,
149010: wxPoint(100, 100), wxSize(160, 100))
150011:
151012: # Associate some events with methods of this class
152013: EVT_SIZE(self, self.OnSize)
153014: EVT_MOVE(self, self.OnMove)
154015:
155016: # Add a panel and some controls to display the size and position
156017: panel = wxPanel(self, -1)
157018: wxStaticText(panel, -1, "Size:",
158019: wxDLG_PNT(panel, wxPoint(4, 4)), wxDefaultSize)
159020: wxStaticText(panel, -1, "Pos:",
160021: wxDLG_PNT(panel, wxPoint(4, 14)), wxDefaultSize)
161022: self.sizeCtrl = wxTextCtrl(panel, -1, "",
162023: wxDLG_PNT(panel, wxPoint(24, 4)),
163024: wxDLG_SZE(panel, wxSize(36, -1)),
164025: wxTE_READONLY)
165026: self.posCtrl = wxTextCtrl(panel, -1, "",
166027: wxDLG_PNT(panel, wxPoint(24, 14)),
167028: wxDLG_SZE(panel, wxSize(36, -1)),
168029: wxTE_READONLY)
169030:
170031:
171032: # This method is called automatically when the CLOSE event is
172033: # sent to this window
173034: def OnCloseWindow(self, event):
174035: # tell the window to kill itself
175036: self.Destroy()
176037:
177038: # This method is called by the system when the window is resized,
178039: # because of the association above.
179040: def OnSize(self, event):
180041: size = event.GetSize()
181042: self.sizeCtrl.SetValue("%s, %s" % (size.width, size.height))
182043:
183044: # tell the event system to continue looking for an event handler,
184045: # so the default handler will get called.
185046: event.Skip()
186047:
187048: # This method is called by the system when the window is moved,
188049: # because of the association above.
189050: def OnMove(self, event):
190051: pos = event.GetPosition()
191052: self.posCtrl.SetValue("%s, %s" % (pos.x, pos.y))
192053:
193054:
194055: # Every wxWindows application must have a class derived from wxApp
195056: class MyApp(wxApp):
196057:
197058: # wxWindows calls this method to initialize the application
198059: def OnInit(self):
199060:
200061: # Create an instance of our customized Frame class
201062: frame = MyFrame(NULL, -1, "This is a test")
202063: frame.Show(true)
203064:
204065: # Tell wxWindows that this is our main window
205066: self.SetTopWindow(frame)
206067:
207068: # Return a success flag
208069: return true
209070:
210071:
211072: app = MyApp(0) # Create an instance of the application class
212073: app.MainLoop() # Tell it to start processing events
213074:
214\end{verbatim}
215\hrule
216
2a47d3c1
JS
217\wxheading{Things to notice}
218
154f22b3 219\begin{enumerate}\itemsep=11pt
06d20283 220\item At line 2 the wxPython classes, constants, and etc. are imported
7e9a386e 221into the current module's namespace. If you prefer to reduce
c9110876 222namespace pollution you can use "{\tt from wxPython import wx}" and
06d20283 223then access all the wxPython identifiers through the wx module, for
c9110876 224example, "{\tt wx.wxFrame}".
06d20283 225\item At line 13 the frame's sizing and moving events are connected to
7e9a386e
JS
226methods of the class. These helper functions are intended to be like
227the event table macros that wxWindows employs. But since static event
06d20283 228tables are impossible with wxPython, we use helpers that are named the
7e9a386e 229same to dynamically build the table. The only real difference is
f6bcfd97 230that the first argument to the event helpers is always the window that
06d20283 231the event table entry should be added to.
c9110876 232\item Notice the use of {\tt wxDLG\_PNT} and {\tt wxDLG\_SZE} in lines 19
7e9a386e 233- 29 to convert from dialog units to pixels. These helpers are unique
06d20283 234to wxPython since Python can't do method overloading like C++.
c9110876 235\item There is an {\tt OnCloseWindow} method at line 34 but no call to
7e9a386e
JS
236EVT\_CLOSE to attach the event to the method. Does it really get
237called? The answer is, yes it does. This is because many of the
c9110876
VS
238{\em standard} events are attached to windows that have the associated
239{\em standard} method names. I have tried to follow the lead of the
240C++ classes in this area to determine what is {\em standard} but since
f6bcfd97 241that changes from time to time I can make no guarantees, nor will it
7e9a386e 242be fully documented. When in doubt, use an EVT\_*** function.
06d20283 243\item At lines 17 to 21 notice that there are no saved references to
7e9a386e 244the panel or the static text items that are created. Those of you
06d20283 245who know Python might be wondering what happens when Python deletes
7e9a386e
JS
246these objects when they go out of scope. Do they disappear from the GUI? They
247don't. Remember that in wxPython the Python objects are just shadows of the
f6bcfd97 248corresponding C++ objects. Once the C++ windows and controls are
06d20283 249attached to their parents, the parents manage them and delete them
7e9a386e 250when necessary. For this reason, most wxPython objects do not need to
2a47d3c1 251have a \_\_del\_\_ method that explicitly causes the C++ object to be
7e9a386e 252deleted. If you ever have the need to forcibly delete a window, use
06d20283 253the Destroy() method as shown on line 36.
06d20283 254\item Just like wxWindows in C++, wxPython apps need to create a class
c9110876
VS
255derived from {\tt wxApp} (line 56) that implements a method named
256{\tt OnInit}, (line 59.) This method should create the application's
257main window (line 62) and use {\tt wxApp.SetTopWindow()} (line 66) to
06d20283 258inform wxWindows about it.
06d20283 259\item And finally, at line 72 an instance of the application class is
7e9a386e 260created. At this point wxPython finishes initializing itself, and calls
c9110876 261the {\tt OnInit} method to get things started. (The zero parameter here is
7e9a386e 262a flag for functionality that isn't quite implemented yet. Just
c9110876 263ignore it for now.) The call to {\tt MainLoop} at line 73 starts the event
06d20283
RD
264loop which continues until the application terminates or all the top
265level windows are closed.
06d20283
RD
266\end{enumerate}
267
06d20283 268%----------------------------------------------------------------------
bd330a69 269\subsection{wxWindows classes implemented in wxPython}\label{wxpclasses}
06d20283 270
7e9a386e 271The following classes are supported in wxPython. Most provide nearly
06d20283 272full implementations of the public interfaces specified in the C++
7e9a386e 273documentation, others are less so. They will all be brought as close
06d20283
RD
274as possible to the C++ spec over time.
275
276\begin{itemize}\itemsep=0pt
277\item \helpref{wxAcceleratorEntry}{wxacceleratorentry}
278\item \helpref{wxAcceleratorTable}{wxacceleratortable}
279\item \helpref{wxActivateEvent}{wxactivateevent}
06d20283 280\item \helpref{wxBitmap}{wxbitmap}
564747ee
RD
281\item \helpref{wxBitmapButton}{wxbitmapbutton}
282\item \helpref{wxBitmapDataObject}{wxbitmapdataobject}
f899db6d 283\item wxBMPHandler
86e78222 284\item \helpref{wxBoxSizer}{wxboxsizer}
06d20283 285\item \helpref{wxBrush}{wxbrush}
b32c6ff0
RD
286\item \helpref{wxBusyInfo}{wxbusyinfo}
287\item \helpref{wxBusyCursor}{wxbusycursor}
06d20283
RD
288\item \helpref{wxButton}{wxbutton}
289\item \helpref{wxCalculateLayoutEvent}{wxcalculatelayoutevent}
f6bcfd97 290\item \helpref{wxCalendarCtrl}{wxcalendarctrl}
86e78222 291\item wxCaret
06d20283
RD
292\item \helpref{wxCheckBox}{wxcheckbox}
293\item \helpref{wxCheckListBox}{wxchecklistbox}
294\item \helpref{wxChoice}{wxchoice}
295\item \helpref{wxClientDC}{wxclientdc}
564747ee 296\item \helpref{wxClipboard}{wxclipboard}
06d20283
RD
297\item \helpref{wxCloseEvent}{wxcloseevent}
298\item \helpref{wxColourData}{wxcolourdata}
299\item \helpref{wxColourDialog}{wxcolourdialog}
300\item \helpref{wxColour}{wxcolour}
301\item \helpref{wxComboBox}{wxcombobox}
302\item \helpref{wxCommandEvent}{wxcommandevent}
303\item \helpref{wxConfig}{wxconfigbase}
304\item \helpref{wxControl}{wxcontrol}
305\item \helpref{wxCursor}{wxcursor}
564747ee
RD
306\item \helpref{wxCustomDataObject}{wxcustomdataobject}
307\item \helpref{wxDataFormat}{wxdataformat}
308\item \helpref{wxDataObject}{wxdataobject}
309\item \helpref{wxDataObjectComposite}{wxdataobjectcomposite}
310\item \helpref{wxDataObjectSimple}{wxdataobjectsimple}
f6bcfd97
BP
311\item \helpref{wxDateTime}{wxdatetime}
312\item \helpref{wxDateSpan}{wxdatespan}
06d20283
RD
313\item \helpref{wxDC}{wxdc}
314\item \helpref{wxDialog}{wxdialog}
315\item \helpref{wxDirDialog}{wxdirdialog}
f6bcfd97 316\item \helpref{wxDragImage}{wxdragimage}
06d20283 317\item \helpref{wxDropFilesEvent}{wxdropfilesevent}
564747ee
RD
318\item \helpref{wxDropSource}{wxdropsource}
319\item \helpref{wxDropTarget}{wxdroptarget}
06d20283
RD
320\item \helpref{wxEraseEvent}{wxeraseevent}
321\item \helpref{wxEvent}{wxevent}
322\item \helpref{wxEvtHandler}{wxevthandler}
f6bcfd97 323\item wxFileConfig
564747ee 324\item \helpref{wxFileDataObject}{wxfiledataobject}
06d20283 325\item \helpref{wxFileDialog}{wxfiledialog}
564747ee 326\item \helpref{wxFileDropTarget}{wxfiledroptarget}
c9f00eeb
RD
327\item \helpref{wxFileSystem}{wxfilesystem}
328\item \helpref{wxFileSystemHandler}{wxfilesystemhandler}
06d20283
RD
329\item \helpref{wxFocusEvent}{wxfocusevent}
330\item \helpref{wxFontData}{wxfontdata}
331\item \helpref{wxFontDialog}{wxfontdialog}
332\item \helpref{wxFont}{wxfont}
333\item \helpref{wxFrame}{wxframe}
c9f00eeb 334\item \helpref{wxFSFile}{wxfsfile}
06d20283 335\item \helpref{wxGauge}{wxgauge}
f899db6d
RD
336\item wxGIFHandler
337\item wxGLCanvas
f6bcfd97 338\begin{comment}
fd34e3a5
JS
339\item wxGridCell
340\item wxGridEvent
06d20283 341\item \helpref{wxGrid}{wxgrid}
f6bcfd97 342\end{comment}
86e78222
RD
343\item \helpref{wxHtmlCell}{wxhtmlcell}
344\item \helpref{wxHtmlContainerCell}{wxhtmlcontainercell}
b32c6ff0
RD
345\item \helpref{wxHtmlDCRenderer}{wxhtmldcrenderer}
346\item \helpref{wxHtmlEasyPrinting}{wxhtmleasyprinting}
86e78222
RD
347\item \helpref{wxHtmlParser}{wxhtmlparser}
348\item \helpref{wxHtmlTagHandler}{wxhtmltaghandler}
349\item \helpref{wxHtmlTag}{wxhtmltag}
350\item \helpref{wxHtmlWinParser}{wxhtmlwinparser}
b32c6ff0 351\item \helpref{wxHtmlPrintout}{wxhtmlprintout}
86e78222
RD
352\item \helpref{wxHtmlWinTagHandler}{wxhtmlwintaghandler}
353\item \helpref{wxHtmlWindow}{wxhtmlwindow}
fd34e3a5 354\item wxIconizeEvent
06d20283
RD
355\item \helpref{wxIcon}{wxicon}
356\item \helpref{wxIdleEvent}{wxidleevent}
f899db6d
RD
357\item \helpref{wxImage}{wximage}
358\item \helpref{wxImageHandler}{wximagehandler}
06d20283
RD
359\item \helpref{wxImageList}{wximagelist}
360\item \helpref{wxIndividualLayoutConstraint}{wxindividuallayoutconstraint}
361\item \helpref{wxInitDialogEvent}{wxinitdialogevent}
c9f00eeb 362\item \helpref{wxInputStream}{wxinputstream}
a98f98ac 363\item \helpref{wxInternetFSHandler}{fs}
06d20283 364\item \helpref{wxJoystickEvent}{wxjoystickevent}
f899db6d 365\item wxJPEGHandler
06d20283
RD
366\item \helpref{wxKeyEvent}{wxkeyevent}
367\item \helpref{wxLayoutAlgorithm}{wxlayoutalgorithm}
368\item \helpref{wxLayoutConstraints}{wxlayoutconstraints}
369\item \helpref{wxListBox}{wxlistbox}
370\item \helpref{wxListCtrl}{wxlistctrl}
371\item \helpref{wxListEvent}{wxlistevent}
21f280f4 372\item \helpref{wxListItem}{wxlistctrlsetitem}
c9f00eeb
RD
373\item \helpref{wxMask}{wxmask}
374\item wxMaximizeEvent
06d20283
RD
375\item \helpref{wxMDIChildFrame}{wxmdichildframe}
376\item \helpref{wxMDIClientWindow}{wxmdiclientwindow}
377\item \helpref{wxMDIParentFrame}{wxmdiparentframe}
06d20283 378\item \helpref{wxMemoryDC}{wxmemorydc}
c9f00eeb 379\item \helpref{wxMemoryFSHandler}{wxmemoryfshandler}
06d20283
RD
380\item \helpref{wxMenuBar}{wxmenubar}
381\item \helpref{wxMenuEvent}{wxmenuevent}
382\item \helpref{wxMenuItem}{wxmenuitem}
383\item \helpref{wxMenu}{wxmenu}
384\item \helpref{wxMessageDialog}{wxmessagedialog}
385\item \helpref{wxMetaFileDC}{wxmetafiledc}
386\item \helpref{wxMiniFrame}{wxminiframe}
387\item \helpref{wxMouseEvent}{wxmouseevent}
388\item \helpref{wxMoveEvent}{wxmoveevent}
389\item \helpref{wxNotebookEvent}{wxnotebookevent}
390\item \helpref{wxNotebook}{wxnotebook}
7bcb11d3 391\item \helpref{wxPageSetupDialogData}{wxpagesetupdialogdata}
06d20283
RD
392\item \helpref{wxPageSetupDialog}{wxpagesetupdialog}
393\item \helpref{wxPaintDC}{wxpaintdc}
394\item \helpref{wxPaintEvent}{wxpaintevent}
395\item \helpref{wxPalette}{wxpalette}
396\item \helpref{wxPanel}{wxpanel}
397\item \helpref{wxPen}{wxpen}
f899db6d 398\item wxPNGHandler
06d20283
RD
399\item \helpref{wxPoint}{wxpoint}
400\item \helpref{wxPostScriptDC}{wxpostscriptdc}
2233e5b8 401\item \helpref{wxPreviewFrame}{wxpreviewframe}
06d20283 402\item \helpref{wxPrintData}{wxprintdata}
2233e5b8 403\item \helpref{wxPrintDialogData}{wxprintdialogdata}
06d20283 404\item \helpref{wxPrintDialog}{wxprintdialog}
2233e5b8
RD
405\item \helpref{wxPrinter}{wxprinter}
406\item \helpref{wxPrintPreview}{wxprintpreview}
06d20283 407\item \helpref{wxPrinterDC}{wxprinterdc}
2233e5b8 408\item \helpref{wxPrintout}{wxprintout}
c9f00eeb 409\item \helpref{wxProcess}{wxprocess}
06d20283
RD
410\item \helpref{wxQueryLayoutInfoEvent}{wxquerylayoutinfoevent}
411\item \helpref{wxRadioBox}{wxradiobox}
412\item \helpref{wxRadioButton}{wxradiobutton}
413\item \helpref{wxRealPoint}{wxrealpoint}
414\item \helpref{wxRect}{wxrect}
415\item \helpref{wxRegionIterator}{wxregioniterator}
416\item \helpref{wxRegion}{wxregion}
417\item \helpref{wxSashEvent}{wxsashevent}
418\item \helpref{wxSashLayoutWindow}{wxsashlayoutwindow}
419\item \helpref{wxSashWindow}{wxsashwindow}
420\item \helpref{wxScreenDC}{wxscreendc}
421\item \helpref{wxScrollBar}{wxscrollbar}
422\item \helpref{wxScrollEvent}{wxscrollevent}
423\item \helpref{wxScrolledWindow}{wxscrolledwindow}
76e1c2de 424\item \helpref{wxScrollWinEvent}{wxscrollwinevent}
fd34e3a5 425\item wxShowEvent
06d20283
RD
426\item \helpref{wxSingleChoiceDialog}{wxsinglechoicedialog}
427\item \helpref{wxSizeEvent}{wxsizeevent}
428\item \helpref{wxSize}{wxsize}
86e78222 429\item \helpref{wxSizer}{wxsizer}
76e1c2de 430\item wxSizerItem
06d20283
RD
431\item \helpref{wxSlider}{wxslider}
432\item \helpref{wxSpinButton}{wxspinbutton}
fd34e3a5 433\item wxSpinEvent
06d20283
RD
434\item \helpref{wxSplitterWindow}{wxsplitterwindow}
435\item \helpref{wxStaticBitmap}{wxstaticbitmap}
436\item \helpref{wxStaticBox}{wxstaticbox}
86e78222 437\item \helpref{wxStaticBoxSizer}{wxstaticboxsizer}
154f22b3 438\item \helpref{wxStaticLine}{wxstaticline}
06d20283
RD
439\item \helpref{wxStaticText}{wxstatictext}
440\item \helpref{wxStatusBar}{wxstatusbar}
441\item \helpref{wxSysColourChangedEvent}{wxsyscolourchangedevent}
442\item \helpref{wxTaskBarIcon}{wxtaskbaricon}
443\item \helpref{wxTextCtrl}{wxtextctrl}
564747ee
RD
444\item \helpref{wxTextDataObject}{wxtextdataobject}
445\item \helpref{wxTextDropTarget}{wxtextdroptarget}
06d20283
RD
446\item \helpref{wxTextEntryDialog}{wxtextentrydialog}
447\item \helpref{wxTimer}{wxtimer}
f6bcfd97
BP
448\item \helpref{wxTimerEvent}{wxtimerevent}
449\item \helpref{wxTimeSpan}{wxtimespan}
450\item \helpref{wxTipProvider}{wxtipprovider}
fd34e3a5 451\item wxToolBarTool
06d20283 452\item \helpref{wxToolBar}{wxtoolbar}
fd34e3a5 453\item wxToolTip
06d20283
RD
454\item \helpref{wxTreeCtrl}{wxtreectrl}
455\item \helpref{wxTreeEvent}{wxtreeevent}
456\item \helpref{wxTreeItemData}{wxtreeitemdata}
fd34e3a5 457\item wxTreeItemId
06d20283 458\item \helpref{wxUpdateUIEvent}{wxupdateuievent}
76e1c2de 459\item \helpref{wxValidator}{wxvalidator}
06d20283
RD
460\item \helpref{wxWindowDC}{wxwindowdc}
461\item \helpref{wxWindow}{wxwindow}
a98f98ac 462\item \helpref{wxZipFSHandler}{fs}
06d20283
RD
463\end{itemize}
464
465%----------------------------------------------------------------------
bd330a69 466\subsection{Where to go for help}\label{wxphelp}
06d20283
RD
467
468Since wxPython is a blending of multiple technologies, help comes from
f6bcfd97
BP
469multiple sources. See
470\urlref{http://wxpython.org/}{http://wxpython.org/} for details on
06d20283 471various sources of help, but probably the best source is the
7e9a386e 472wxPython-users mail list. You can view the archive or subscribe by
06d20283
RD
473going to
474
b659a828 475\urlref{http://lists.wxwindows.org/mailman/listinfo/wxpython-users}{http://lists.wxwindows.org/mailman/listinfo/wxpython-users}
06d20283
RD
476
477Or you can send mail directly to the list using this address:
478
b659a828 479wxpython-users@lists.wxwindows.org
f6bcfd97 480