]>
Commit | Line | Data |
---|---|---|
bd330a69 JS |
1 | \section{wxPython overview}\label{wxpython} |
2 | %\setheader{{\it CHAPTER \thechapter}}{}{}{}{}{{\it CHAPTER \thechapter}}% | |
3 | %\setfooter{\thepage}{}{}{}{}{\thepage}% | |
605d715d | 4 | |
bd330a69 | 5 | This 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 | 10 | wxPython 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 | 15 | So what is Python? Go to |
7e9a386e JS |
16 | \urlref{http://www.python.org}{http://www.python.org} to learn more, |
17 | but in a nutshell Python is an interpreted, | |
06d20283 RD |
18 | interactive, object-oriented programming language. It is often |
19 | compared to Tcl, Perl, Scheme or Java. | |
20 | ||
21 | Python combines remarkable power with very clear syntax. It has | |
22 | modules, classes, exceptions, very high level dynamic data types, and | |
23 | dynamic typing. There are interfaces to many system calls and | |
24 | libraries, and new built-in modules are easily written in C or | |
25 | C++. Python is also usable as an extension language for applications | |
26 | that need a programmable interface. | |
27 | ||
28 | Python is copyrighted but freely usable and distributable, even for | |
29 | commercial use. | |
30 | ||
31 | \wxheading{wxPython} | |
32 | ||
33 | wxPython is a Python package that can be imported at runtime that | |
34 | includes a collection of Python modules and an extension module | |
7e9a386e JS |
35 | (native code). It provides a series of Python classes that mirror (or |
36 | shadow) many of the wxWindows GUI classes. This extension module | |
2edb0bde | 37 | attempts to mirror the class hierarchy of wxWindows as closely as |
f6bcfd97 | 38 | possible. This means that there is a wxFrame class in wxPython that |
06d20283 RD |
39 | looks, smells, tastes and acts almost the same as the wxFrame class in |
40 | the C++ version. | |
41 | ||
2edb0bde | 42 | wxPython is very versatile. It can be used to create standalone GUI |
06d20283 RD |
43 | applications, or in situations where Python is embedded in a C++ |
44 | application as an internal scripting or macro language. | |
45 | ||
46 | Currently wxPython is available for Win32 platforms and the GTK | |
c9f00eeb RD |
47 | toolkit (wxGTK) on most Unix/X-windows platforms. See the wxPython |
48 | website \urlref{http://wxPython.org/}{http://wxPython.org/} for | |
2a47d3c1 | 49 | details about getting wxPython working for you. |
06d20283 | 50 | |
06d20283 | 51 | %---------------------------------------------------------------------- |
bd330a69 | 52 | \subsection{Why use wxPython?}\label{wxpwhy} |
06d20283 | 53 | |
06d20283 | 54 | So why would you want to use wxPython over just C++ and wxWindows? |
c9f00eeb | 55 | Personally I prefer using Python for everything. I only use C++ when I |
2edb0bde | 56 | absolutely have to eke more performance out of an algorithm, and even |
f6bcfd97 | 57 | then I usually code it as an extension module and leave the majority |
06d20283 RD |
58 | of the program in Python. |
59 | ||
60 | Another good thing to use wxPython for is quick prototyping of your | |
7e9a386e JS |
61 | wxWindows apps. With C++ you have to continuously go though the |
62 | edit-compile-link-run cycle, which can be quite time consuming. With | |
63 | Python it is only an edit-run cycle. You can easily build an | |
06d20283 | 64 | application in a few hours with Python that would normally take a few |
7e9a386e | 65 | days or longer with C++. Converting a wxPython app to a C++/wxWindows app |
06d20283 RD |
66 | should be a straight forward task. |
67 | ||
06d20283 | 68 | %---------------------------------------------------------------------- |
bd330a69 | 69 | \subsection{Other Python GUIs}\label{wxpother} |
06d20283 RD |
70 | |
71 | There are other GUI solutions out there for Python. | |
72 | ||
73 | \wxheading{Tkinter} | |
74 | ||
2edb0bde | 75 | Tkinter is the de facto standard GUI for Python. It is available |
7e9a386e | 76 | on nearly every platform that Python and Tcl/TK are. Why Tcl/Tk? |
06d20283 RD |
77 | Well because Tkinter is just a wrapper around Tcl's GUI toolkit, Tk. |
78 | This has its upsides and its downsides... | |
79 | ||
7e9a386e JS |
80 | The upside is that Tk is a pretty versatile toolkit. It can be made |
81 | to do a lot of things in a lot of different environments. It is fairly | |
f6bcfd97 | 82 | easy to create new widgets and use them interchangeably in your |
06d20283 RD |
83 | programs. |
84 | ||
7e9a386e | 85 | The downside is Tcl. When using Tkinter you actually have two |
06d20283 | 86 | separate language interpreters running, the Python interpreter and the |
7e9a386e JS |
87 | Tcl interpreter for the GUI. Since the guts of Tcl is mostly about |
88 | string processing, it is fairly slow as well. (Not too bad on a fast | |
06d20283 RD |
89 | Pentium II, but you really notice the difference on slower machines.) |
90 | ||
f6bcfd97 | 91 | It wasn't until the latest version of Tcl/Tk that native Look and |
7e9a386e JS |
92 | Feel was possible on non-Motif platforms. This is because Tk |
93 | usually implements its own widgets (controls) even when there are | |
06d20283 RD |
94 | native controls available. |
95 | ||
7e9a386e | 96 | Tkinter 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 |
98 | level of abstraction. | |
99 | ||
100 | \wxheading{PythonWin} | |
101 | ||
7e9a386e JS |
102 | PythonWin is an add-on package for Python for the Win32 platform. It |
103 | includes wrappers for MFC as well as much of the Win32 API. Because | |
06d20283 | 104 | of its foundation, it is very familiar for programmers who have |
7e9a386e JS |
105 | experience with MFC and the Win32 API. It is obviously not compatible |
106 | with other platforms and toolkits. PythonWin is organized as separate | |
06d20283 RD |
107 | packages and modules so you can use the pieces you need without having |
108 | to use the GUI portions. | |
109 | ||
110 | \wxheading{Others} | |
111 | ||
112 | There are quite a few other GUI modules available for Python, some in | |
f6bcfd97 | 113 | active use, some that haven't been updated for ages. Most are simple |
06d20283 | 114 | wrappers around some C or C++ toolkit or another, and most are not |
f6bcfd97 | 115 | cross-platform compatible. See \urlref{this link}{http://www.python.org/download/Contributed.html\#Graphics} |
06d20283 RD |
116 | for 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 | 123 | I'm not going to try and teach the Python language here. You can do |
06d20283 RD |
124 | that at the \urlref{Python Tutorial}{http://www.python.org/doc/tut/tut.html}. |
125 | I'm also going to assume that you know a bit about wxWindows already, | |
126 | enough to notice the similarities in the classes used. | |
127 | ||
7e9a386e | 128 | Take a look at the following wxPython program. You can find a similar |
c9110876 | 129 | program in the {\tt wxPython/demo} directory, named {\tt DialogUnits.py}. If your |
06d20283 RD |
130 | Python and wxPython are properly installed, you should be able to run |
131 | it 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} | |
140 | 001: ## import all of the wxPython GUI package | |
141 | 002: from wxPython.wx import * | |
142 | 003: | |
143 | 004: ## Create a new frame class, derived from the wxPython Frame. | |
144 | 005: class MyFrame(wxFrame): | |
145 | 006: | |
146 | 007: def __init__(self, parent, id, title): | |
147 | 008: # First, call the base class' __init__ method to create the frame | |
148 | 009: wxFrame.__init__(self, parent, id, title, | |
149 | 010: wxPoint(100, 100), wxSize(160, 100)) | |
150 | 011: | |
151 | 012: # Associate some events with methods of this class | |
152 | 013: EVT_SIZE(self, self.OnSize) | |
153 | 014: EVT_MOVE(self, self.OnMove) | |
154 | 015: | |
155 | 016: # Add a panel and some controls to display the size and position | |
156 | 017: panel = wxPanel(self, -1) | |
157 | 018: wxStaticText(panel, -1, "Size:", | |
158 | 019: wxDLG_PNT(panel, wxPoint(4, 4)), wxDefaultSize) | |
159 | 020: wxStaticText(panel, -1, "Pos:", | |
160 | 021: wxDLG_PNT(panel, wxPoint(4, 14)), wxDefaultSize) | |
161 | 022: self.sizeCtrl = wxTextCtrl(panel, -1, "", | |
162 | 023: wxDLG_PNT(panel, wxPoint(24, 4)), | |
163 | 024: wxDLG_SZE(panel, wxSize(36, -1)), | |
164 | 025: wxTE_READONLY) | |
165 | 026: self.posCtrl = wxTextCtrl(panel, -1, "", | |
166 | 027: wxDLG_PNT(panel, wxPoint(24, 14)), | |
167 | 028: wxDLG_SZE(panel, wxSize(36, -1)), | |
168 | 029: wxTE_READONLY) | |
169 | 030: | |
170 | 031: | |
171 | 032: # This method is called automatically when the CLOSE event is | |
172 | 033: # sent to this window | |
173 | 034: def OnCloseWindow(self, event): | |
174 | 035: # tell the window to kill itself | |
175 | 036: self.Destroy() | |
176 | 037: | |
177 | 038: # This method is called by the system when the window is resized, | |
178 | 039: # because of the association above. | |
179 | 040: def OnSize(self, event): | |
180 | 041: size = event.GetSize() | |
181 | 042: self.sizeCtrl.SetValue("%s, %s" % (size.width, size.height)) | |
182 | 043: | |
183 | 044: # tell the event system to continue looking for an event handler, | |
184 | 045: # so the default handler will get called. | |
185 | 046: event.Skip() | |
186 | 047: | |
187 | 048: # This method is called by the system when the window is moved, | |
188 | 049: # because of the association above. | |
189 | 050: def OnMove(self, event): | |
190 | 051: pos = event.GetPosition() | |
191 | 052: self.posCtrl.SetValue("%s, %s" % (pos.x, pos.y)) | |
192 | 053: | |
193 | 054: | |
194 | 055: # Every wxWindows application must have a class derived from wxApp | |
195 | 056: class MyApp(wxApp): | |
196 | 057: | |
197 | 058: # wxWindows calls this method to initialize the application | |
198 | 059: def OnInit(self): | |
199 | 060: | |
200 | 061: # Create an instance of our customized Frame class | |
201 | 062: frame = MyFrame(NULL, -1, "This is a test") | |
202 | 063: frame.Show(true) | |
203 | 064: | |
204 | 065: # Tell wxWindows that this is our main window | |
205 | 066: self.SetTopWindow(frame) | |
206 | 067: | |
207 | 068: # Return a success flag | |
208 | 069: return true | |
209 | 070: | |
210 | 071: | |
211 | 072: app = MyApp(0) # Create an instance of the application class | |
212 | 073: app.MainLoop() # Tell it to start processing events | |
213 | 074: | |
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 | 221 | into the current module's namespace. If you prefer to reduce |
c9110876 | 222 | namespace pollution you can use "{\tt from wxPython import wx}" and |
06d20283 | 223 | then access all the wxPython identifiers through the wx module, for |
c9110876 | 224 | example, "{\tt wx.wxFrame}". |
06d20283 | 225 | \item At line 13 the frame's sizing and moving events are connected to |
7e9a386e JS |
226 | methods of the class. These helper functions are intended to be like |
227 | the event table macros that wxWindows employs. But since static event | |
06d20283 | 228 | tables are impossible with wxPython, we use helpers that are named the |
7e9a386e | 229 | same to dynamically build the table. The only real difference is |
f6bcfd97 | 230 | that the first argument to the event helpers is always the window that |
06d20283 | 231 | the 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 | 234 | to 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 |
236 | EVT\_CLOSE to attach the event to the method. Does it really get |
237 | called? 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 | |
240 | C++ classes in this area to determine what is {\em standard} but since | |
f6bcfd97 | 241 | that changes from time to time I can make no guarantees, nor will it |
7e9a386e | 242 | be 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 | 244 | the panel or the static text items that are created. Those of you |
06d20283 | 245 | who know Python might be wondering what happens when Python deletes |
7e9a386e JS |
246 | these objects when they go out of scope. Do they disappear from the GUI? They |
247 | don't. Remember that in wxPython the Python objects are just shadows of the | |
f6bcfd97 | 248 | corresponding C++ objects. Once the C++ windows and controls are |
06d20283 | 249 | attached to their parents, the parents manage them and delete them |
7e9a386e | 250 | when necessary. For this reason, most wxPython objects do not need to |
2a47d3c1 | 251 | have a \_\_del\_\_ method that explicitly causes the C++ object to be |
7e9a386e | 252 | deleted. If you ever have the need to forcibly delete a window, use |
06d20283 | 253 | the Destroy() method as shown on line 36. |
06d20283 | 254 | \item Just like wxWindows in C++, wxPython apps need to create a class |
c9110876 VS |
255 | derived from {\tt wxApp} (line 56) that implements a method named |
256 | {\tt OnInit}, (line 59.) This method should create the application's | |
257 | main window (line 62) and use {\tt wxApp.SetTopWindow()} (line 66) to | |
06d20283 | 258 | inform wxWindows about it. |
06d20283 | 259 | \item And finally, at line 72 an instance of the application class is |
7e9a386e | 260 | created. At this point wxPython finishes initializing itself, and calls |
c9110876 | 261 | the {\tt OnInit} method to get things started. (The zero parameter here is |
7e9a386e | 262 | a flag for functionality that isn't quite implemented yet. Just |
c9110876 | 263 | ignore it for now.) The call to {\tt MainLoop} at line 73 starts the event |
06d20283 RD |
264 | loop which continues until the application terminates or all the top |
265 | level windows are closed. | |
06d20283 RD |
266 | \end{enumerate} |
267 | ||
06d20283 | 268 | %---------------------------------------------------------------------- |
bd330a69 | 269 | \subsection{wxWindows classes implemented in wxPython}\label{wxpclasses} |
06d20283 | 270 | |
7e9a386e | 271 | The following classes are supported in wxPython. Most provide nearly |
06d20283 | 272 | full implementations of the public interfaces specified in the C++ |
7e9a386e | 273 | documentation, others are less so. They will all be brought as close |
06d20283 RD |
274 | as 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 | |
468 | Since wxPython is a blending of multiple technologies, help comes from | |
f6bcfd97 BP |
469 | multiple sources. See |
470 | \urlref{http://wxpython.org/}{http://wxpython.org/} for details on | |
06d20283 | 471 | various sources of help, but probably the best source is the |
7e9a386e | 472 | wxPython-users mail list. You can view the archive or subscribe by |
06d20283 RD |
473 | going to |
474 | ||
b659a828 | 475 | \urlref{http://lists.wxwindows.org/mailman/listinfo/wxpython-users}{http://lists.wxwindows.org/mailman/listinfo/wxpython-users} |
06d20283 RD |
476 | |
477 | Or you can send mail directly to the list using this address: | |
478 | ||
b659a828 | 479 | wxpython-users@lists.wxwindows.org |
f6bcfd97 | 480 |