]>
Commit | Line | Data |
---|---|---|
06d20283 RD |
1 | \chapter{wxPython Notes}\label{wxPython} |
2 | \pagenumbering{arabic}% | |
3 | \setheader{{\it CHAPTER \thechapter}}{}{}{}{}{{\it CHAPTER \thechapter}}% | |
4 | \setfooter{\thepage}{}{}{}{}{\thepage}% | |
5 | ||
6 | %---------------------------------------------------------------------- | |
7 | \section{What is wxPython?}\label{wxpwhat} | |
8 | ||
9 | wxPython is a blending of the wxWindows GUI classes and the | |
10 | \urlref{Python}{http://www.python.org/} programming language. | |
11 | ||
12 | \wxheading{Python} | |
13 | ||
14 | So what is Python? Go to | |
15 | \urlref{http://www.python.org}{http://www.python.org} | |
16 | to learn more, but in a nutshell Python is an interpreted, | |
17 | interactive, object-oriented programming language. It is often | |
18 | compared to Tcl, Perl, Scheme or Java. | |
19 | ||
20 | Python combines remarkable power with very clear syntax. It has | |
21 | modules, classes, exceptions, very high level dynamic data types, and | |
22 | dynamic typing. There are interfaces to many system calls and | |
23 | libraries, and new built-in modules are easily written in C or | |
24 | C++. Python is also usable as an extension language for applications | |
25 | that need a programmable interface. | |
26 | ||
27 | Python is copyrighted but freely usable and distributable, even for | |
28 | commercial use. | |
29 | ||
30 | \wxheading{wxPython} | |
31 | ||
32 | wxPython is a Python package that can be imported at runtime that | |
33 | includes a collection of Python modules and an extension module | |
34 | (native code). It provides a series of Python classes that mirror (or | |
35 | shadow) many of the wxWindows GUI classes. This extension module | |
36 | attempts to mirror the class heiarchy of wxWindows as closely as | |
37 | possble. This means that there is a wxFrame class in wxPython that | |
38 | looks, smells, tastes and acts almost the same as the wxFrame class in | |
39 | the C++ version. | |
40 | ||
41 | wxPython is very versitile. It can be used to create standalone GUI | |
42 | applications, or in situations where Python is embedded in a C++ | |
43 | application as an internal scripting or macro language. | |
44 | ||
45 | Currently wxPython is available for Win32 platforms and the GTK | |
46 | toolkit (wxGTK) on most *nix/X-windows platforms. The effort to | |
47 | enable wxPython for wxMotif will begin shortly. See \helpref{Building | |
48 | Python}{wxpbuild} for details about getting wxPython working for you. | |
49 | ||
50 | ||
51 | %---------------------------------------------------------------------- | |
52 | \section{Why use wxPython?}\label{wxpwhy} | |
53 | ||
54 | ||
55 | So why would you want to use wxPython over just C++ and wxWindows? | |
56 | Personally I prefer using Python for everything. I only use C++ when | |
57 | I absolutly have to eek more performance out of an algorithm, and even | |
58 | then I ususally code it as an extension module and leave the majority | |
59 | of the program in Python. | |
60 | ||
61 | Another good thing to use wxPython for is quick prototyping of your | |
62 | wxWindows apps. With C++ you have to continuously go though the | |
63 | edit-compile-link-run cycle, which can be quite time comsuming. With | |
64 | Python it is only an edit-run cycle. You can easily build an | |
65 | application in a few hours with Python that would normally take a few | |
66 | days or longer with C++. Converting a wxPython app to a C++/wxWindows app | |
67 | should be a straight forward task. | |
68 | ||
69 | ||
70 | %---------------------------------------------------------------------- | |
71 | \section{Other Python GUIs}\label{wxpother} | |
72 | ||
73 | There are other GUI solutions out there for Python. | |
74 | ||
75 | \wxheading{Tkinter} | |
76 | ||
77 | Tkinter is the defacto standard GUI for Python. It is available | |
78 | on nearly every platform that Python and Tcl/TK are. Why Tcl/Tk? | |
79 | Well because Tkinter is just a wrapper around Tcl's GUI toolkit, Tk. | |
80 | This has its upsides and its downsides... | |
81 | ||
82 | The upside is that Tk is a pretty veristile toolkit. It can be made | |
83 | to do a lot of things in a lot of different environments. It is fairly | |
84 | easy to create new widgets and use them interchangably in your | |
85 | programs. | |
86 | ||
87 | The downside is Tcl. When using Tkinter you actually have two | |
88 | separate language interpreters running, the Python interpreter and the | |
89 | Tcl interpreter for the GUI. Since the guts of Tcl is mostly about | |
90 | string processing, it is fairly slow as well. (Not too bad on a fast | |
91 | Pentium II, but you really notice the difference on slower machines.) | |
92 | ||
93 | It wasn't until the lastest version of Tcl/Tk that native Look and | |
94 | Feel's were possible on non-Motif platforms. This is because Tk | |
95 | usually implements it's own widgets (controls) even when there are | |
96 | native controls available. | |
97 | ||
98 | Tkinter is a pretty low-level toolkit. You have to do a lot of work | |
99 | (verbose program code) to do things that would be much simpler with a higher | |
100 | level of abstraction. | |
101 | ||
102 | \wxheading{PythonWin} | |
103 | ||
104 | PythonWin is an add-on package for Python for the Win32 platform. It | |
105 | includes wrappers for MFC as well as much of the win32 API. Because | |
106 | of its foundation, it is very familiar for programmers who have | |
107 | experience with MFC and the Win32 API. It is obviously not compatible | |
108 | with other platforms and toolkits. PythonWin is organized as separate | |
109 | packages and modules so you can use the pieces you need without having | |
110 | to use the GUI portions. | |
111 | ||
112 | \wxheading{Others} | |
113 | ||
114 | There are quite a few other GUI modules available for Python, some in | |
115 | active use, some that havn't been updated for ages. Most are simple | |
116 | wrappers around some C or C++ toolkit or another, and most are not | |
117 | cross-platform compatible. See \urlref{this | |
118 | link}{http://www.python.org/download/Contributed.html\#Graphics} | |
119 | for a listing of a few of them. | |
120 | ||
121 | ||
122 | %---------------------------------------------------------------------- | |
123 | \section{Building wxPython}\label{wxpbuild} | |
124 | ||
125 | I used SWIG (\urlref{http://www.swig.org}{http://www.swig.org}) to | |
126 | create the source code for the extension module. This enabled me to | |
127 | only have to deal with a small amount of code and only have to bother | |
128 | with the exceptional issues. SWIG takes care of the rest and | |
129 | generates all the repetative code for me. You don't need SWIG to | |
130 | build the extension module as all the generated C++ code is included | |
131 | under the src directory. If you try to build wxPython and get errors | |
132 | because SWIG is missing, then simply touch the .cpp and .py files so | |
133 | make won't attempt to build them from the .i files. | |
134 | ||
135 | I added a few minor features to SWIG to control some of the code | |
136 | generation. If you want to play around with this the patches are in | |
137 | wxPython/SWIG.patches and they should be applied to the 1.1p5 version | |
138 | of SWIG. These new patches are documented at | |
139 | \urlref{this site}{http://starship.skyport.net/crew/robind/python/\#swig}, | |
140 | and they should also end up in the 1.2 version of SWIG. | |
141 | ||
142 | wxPython is organized as a Python package. This means that the | |
143 | directory containing the results of the build process should be a | |
144 | subdirectory of a directory on the \tt{PYTHONPATH}, (and preferably | |
145 | should be named wxPython.) You can control where the build process | |
146 | will dump wxPython by setting the \tt{TARGETDIR} makefile variable. | |
147 | The default is \tt{\$(WXWIN)/utils/wxPython}. If you leave it here | |
148 | then you should add \tt{\$(WXWIN)/utils} to your \tt{PYTHONPATH}. | |
149 | However, you may prefer to use something that is already on your | |
150 | \tt{PYTHONPATH}, such as the \tt{site-packages} directory on Unix | |
151 | systems. | |
152 | ||
153 | ||
154 | \wxheading{Win32} | |
155 | ||
156 | These instructions assume that you have Microsoft Visual C++ 5.0 or | |
157 | 6.0, that you have installed the command-line tools, and that the | |
158 | appropriate environment variables are set for these tools. You should | |
159 | also have Python 1.5.1 installed, and wxWindows installed and built as | |
160 | specified below. | |
161 | ||
162 | \begin{enumerate}\itemsep=0pt | |
163 | \item Build wxWindows with \tt{wxUSE_RESOURCE_LOADING_IN_MSW} set to 1 in | |
164 | \tt{include/wx/msw/setup.h} so icons can be loaded dynamically. While | |
165 | there, make sure \tt{wxUSE_OWNER_DRAWN} is also set to 1. | |
166 | ||
167 | \item Change into the \tt{\$(WXWIN)/utils/wxPython/src} directory. | |
168 | ||
169 | \item Edit makefile.vc and specify where your python installation is at. | |
170 | You may also want to fiddle with the \tt{TARGETDIR} variable as described | |
171 | above. | |
172 | ||
173 | \item Run \tt{nmake -f makefile.vc} | |
174 | ||
175 | \item If it builds successfully, congratulations! Move on to the next | |
176 | step. If not then you can try mailing the wxwin-developers list for | |
177 | help. Also, I will always have a pre-built win32 version of this extension module at | |
178 | \urlref{http://alldunn.com/wxPython}{http://alldunn.com/wxPython}. | |
179 | ||
180 | \item Change to the \tt{\$(WXWIN)/utils/wxPython/tests} directory. | |
181 | ||
182 | \item Try executing the test programs. Note that some of these print | |
183 | diagnositc or test info to standard output, so they will require the | |
184 | console version of python. For example: | |
185 | ||
186 | \tt{python test1.py} | |
187 | ||
188 | To run them without requiring a console, you can use the \tt{pythonw.exe} | |
189 | version of Python either from the command line or from a shortcut. | |
190 | ||
191 | \end{enumerate} | |
192 | ||
193 | ||
194 | \wxheading{Unix} | |
195 | ||
196 | These directions assume that you have already successfully built | |
197 | wxWindows for GTK, and installed Python 1.5.1. If you build Python | |
198 | yourself, you will get everything installed that you need simply by | |
199 | doing \bftt{make install}. If you get Python from an RPM or other | |
200 | pre-packaged source then there will probably be a separate package | |
201 | with the development libraries, etc. that you will need to install. | |
202 | ||
203 | ||
204 | \begin{enumerate}\itemsep=0pt | |
205 | \item Change into the \tt{\$(WXWIN)/utils/wxPython/src} directory. | |
206 | ||
207 | \item Edit \tt{Setup.in} and ensure that the flags, directories, and toolkit | |
208 | options are correct, (hopefully this will be done by \tt{configure} | |
209 | soon.) See the above commentary about \tt{TARGETDIR}. There are a | |
210 | few sample Setup.in.[platform] files provided. | |
211 | ||
212 | \item Run this command to generate a makefile: | |
213 | ||
214 | \tt{make -f Makefile.pre.in boot} | |
215 | ||
216 | \item Once you have the \tt{Makefile}, run \bftt{make} to build and then | |
217 | \bftt{make install} to install the wxPython extension module. | |
218 | ||
219 | \item Change to the \tt{\$(WXWIN)/utils/wxPython/tests} directory. | |
220 | ||
221 | \item Try executing the test programs. For example: | |
222 | ||
223 | \tt{python test1.py} | |
224 | ||
225 | \end{enumerate} | |
226 | ||
227 | ||
228 | ||
229 | %---------------------------------------------------------------------- | |
230 | \section{Using wxPython}\label{wxpusing} | |
231 | ||
232 | \wxheading{First things first...} | |
233 | ||
234 | I'm not going to try and teach the Python language here. You can do | |
235 | that at the \urlref{Python Tutorial}{http://www.python.org/doc/tut/tut.html}. | |
236 | I'm also going to assume that you know a bit about wxWindows already, | |
237 | enough to notice the similarities in the classes used. | |
238 | ||
239 | Take a look at the following wxPython program. You can find a similar | |
240 | program in the \tt{wxPython/tests} directory, named \tt{test7.py}. If your | |
241 | Python and wxPython are properly installed, you should be able to run | |
242 | it by issuing this command: | |
243 | ||
244 | \begin{indented}{1cm} | |
245 | \bftt{python test7.py} | |
246 | \end{indented} | |
247 | ||
248 | \hrule | |
249 | ||
250 | \begin{verbatim} | |
251 | 001: ## import all of the wxPython GUI package | |
252 | 002: from wxPython.wx import * | |
253 | 003: | |
254 | 004: ## Create a new frame class, derived from the wxPython Frame. | |
255 | 005: class MyFrame(wxFrame): | |
256 | 006: | |
257 | 007: def __init__(self, parent, id, title): | |
258 | 008: # First, call the base class' __init__ method to create the frame | |
259 | 009: wxFrame.__init__(self, parent, id, title, | |
260 | 010: wxPoint(100, 100), wxSize(160, 100)) | |
261 | 011: | |
262 | 012: # Associate some events with methods of this class | |
263 | 013: EVT_SIZE(self, self.OnSize) | |
264 | 014: EVT_MOVE(self, self.OnMove) | |
265 | 015: | |
266 | 016: # Add a panel and some controls to display the size and position | |
267 | 017: panel = wxPanel(self, -1) | |
268 | 018: wxStaticText(panel, -1, "Size:", | |
269 | 019: wxDLG_PNT(panel, wxPoint(4, 4)), wxDefaultSize) | |
270 | 020: wxStaticText(panel, -1, "Pos:", | |
271 | 021: wxDLG_PNT(panel, wxPoint(4, 14)), wxDefaultSize) | |
272 | 022: self.sizeCtrl = wxTextCtrl(panel, -1, "", | |
273 | 023: wxDLG_PNT(panel, wxPoint(24, 4)), | |
274 | 024: wxDLG_SZE(panel, wxSize(36, -1)), | |
275 | 025: wxTE_READONLY) | |
276 | 026: self.posCtrl = wxTextCtrl(panel, -1, "", | |
277 | 027: wxDLG_PNT(panel, wxPoint(24, 14)), | |
278 | 028: wxDLG_SZE(panel, wxSize(36, -1)), | |
279 | 029: wxTE_READONLY) | |
280 | 030: | |
281 | 031: | |
282 | 032: # This method is called automatically when the CLOSE event is | |
283 | 033: # sent to this window | |
284 | 034: def OnCloseWindow(self, event): | |
285 | 035: # tell the window to kill itself | |
286 | 036: self.Destroy() | |
287 | 037: | |
288 | 038: # This method is called by the system when the window is resized, | |
289 | 039: # because of the association above. | |
290 | 040: def OnSize(self, event): | |
291 | 041: size = event.GetSize() | |
292 | 042: self.sizeCtrl.SetValue("%s, %s" % (size.width, size.height)) | |
293 | 043: | |
294 | 044: # tell the event system to continue looking for an event handler, | |
295 | 045: # so the default handler will get called. | |
296 | 046: event.Skip() | |
297 | 047: | |
298 | 048: # This method is called by the system when the window is moved, | |
299 | 049: # because of the association above. | |
300 | 050: def OnMove(self, event): | |
301 | 051: pos = event.GetPosition() | |
302 | 052: self.posCtrl.SetValue("%s, %s" % (pos.x, pos.y)) | |
303 | 053: | |
304 | 054: | |
305 | 055: # Every wxWindows application must have a class derived from wxApp | |
306 | 056: class MyApp(wxApp): | |
307 | 057: | |
308 | 058: # wxWindows calls this method to initialize the application | |
309 | 059: def OnInit(self): | |
310 | 060: | |
311 | 061: # Create an instance of our customized Frame class | |
312 | 062: frame = MyFrame(NULL, -1, "This is a test") | |
313 | 063: frame.Show(true) | |
314 | 064: | |
315 | 065: # Tell wxWindows that this is our main window | |
316 | 066: self.SetTopWindow(frame) | |
317 | 067: | |
318 | 068: # Return a success flag | |
319 | 069: return true | |
320 | 070: | |
321 | 071: | |
322 | 072: app = MyApp(0) # Create an instance of the application class | |
323 | 073: app.MainLoop() # Tell it to start processing events | |
324 | 074: | |
325 | \end{verbatim} | |
326 | \hrule | |
327 | ||
328 | \wxheading{Things to notice:}\begin{enumerate}\itemsep=0pt | |
329 | \item At line 2 the wxPython classes, constants, and etc. are imported | |
330 | into the current module's namespace. If you prefer to reduce | |
331 | namespace polution you can use "\tt{from wxPython import wx}" and | |
332 | then access all the wxPython identifiers through the wx module, for | |
333 | example, "\tt{wx.wxFrame}". | |
334 | ||
335 | \item At line 13 the frame's sizing and moving events are connected to | |
336 | methods of the class. These helper functions are intended to be like | |
337 | the event table macros that wxWindows employs. But since static event | |
338 | tables are impossible with wxPython, we use helpers that are named the | |
339 | same to dynamically build the table. The only real difference is | |
340 | that the first arguemnt to the event helpers is always the window that | |
341 | the event table entry should be added to. | |
342 | ||
343 | \item Notice the use of \tt{wxDLG_PNT} and \tt{wxDLG_SZE} in lines 19 | |
344 | - 29 to convert from dialog units to pixels. These helpers are unique | |
345 | to wxPython since Python can't do method overloading like C++. | |
346 | ||
347 | \item There is an \tt{OnCloseWindow} method at line 34 but no call to | |
348 | EVT_CLOSE to attach the event to the method. Does it really get | |
349 | called? The answer is, yes it does. This is because many of the | |
350 | \em{standard} events are attached to windows that have the associated | |
351 | \em{standard} method names. I have tried to follow the lead of the | |
352 | C++ classes in this area to determine what is \em{standard} but since | |
353 | that changes from time to time I can make no guarentees, nor will it | |
354 | be fully documented. When in doubt, use an EVT_*** function. | |
355 | ||
356 | \item At lines 17 to 21 notice that there are no saved references to | |
357 | the panel or the static text items that are created. Those of you | |
358 | who know Python might be wondering what happens when Python deletes | |
359 | these objects when they go out of scope. Do they disappear from the GUI? They | |
360 | don't. Remember that in wxPython the Python objects are just shadows of the | |
361 | coresponding C++ objects. Once the C++ windows and controls are | |
362 | attached to their parents, the parents manage them and delete them | |
363 | when necessary. For this reason, most wxPython objects do not need to | |
364 | have a __del__ method that explicitly causes the C++ object to be | |
365 | deleted. If you ever have the need to forcibly delete a window, use | |
366 | the Destroy() method as shown on line 36. | |
367 | ||
368 | \item Just like wxWindows in C++, wxPython apps need to create a class | |
369 | derived from \tt{wxApp} (line 56) that implements a method named | |
370 | \tt{OnInit}, (line 59.) This method should create the application's | |
371 | main window (line 62) and use \tt{wxApp.SetTopWindow()} (line 66) to | |
372 | inform wxWindows about it. | |
373 | ||
374 | \item And finally, at line 72 an instance of the application class is | |
375 | created. At this point wxPython finishes initializing itself, and calls | |
376 | the \tt{OnInit} method to get things started. (The zero parameter here is | |
377 | a flag for functionality that isn't quite implemented yet. Just | |
378 | ignore it for now.) The call to \tt{MainLoop} at line 73 starts the event | |
379 | loop which continues until the application terminates or all the top | |
380 | level windows are closed. | |
381 | ||
382 | \end{enumerate} | |
383 | ||
384 | ||
385 | ||
386 | %---------------------------------------------------------------------- | |
387 | \section{wxWindows classes implemented in wxPython}\label{wxpclasses} | |
388 | ||
389 | The following classes are supported in wxPython. Most provide nearly | |
390 | full implementations of the public interfaces specified in the C++ | |
391 | documentation, others are less so. They will all be brought as close | |
392 | as possible to the C++ spec over time. | |
393 | ||
394 | \begin{itemize}\itemsep=0pt | |
395 | \item \helpref{wxAcceleratorEntry}{wxacceleratorentry} | |
396 | \item \helpref{wxAcceleratorTable}{wxacceleratortable} | |
397 | \item \helpref{wxActivateEvent}{wxactivateevent} | |
398 | \item \helpref{wxBitmapButton}{wxbitmapbutton} | |
399 | \item \helpref{wxBitmap}{wxbitmap} | |
400 | \item \helpref{wxBrush}{wxbrush} | |
401 | \item \helpref{wxButton}{wxbutton} | |
402 | \item \helpref{wxCalculateLayoutEvent}{wxcalculatelayoutevent} | |
403 | \item \helpref{wxCheckBox}{wxcheckbox} | |
404 | \item \helpref{wxCheckListBox}{wxchecklistbox} | |
405 | \item \helpref{wxChoice}{wxchoice} | |
406 | \item \helpref{wxClientDC}{wxclientdc} | |
407 | \item \helpref{wxCloseEvent}{wxcloseevent} | |
408 | \item \helpref{wxColourData}{wxcolourdata} | |
409 | \item \helpref{wxColourDialog}{wxcolourdialog} | |
410 | \item \helpref{wxColour}{wxcolour} | |
411 | \item \helpref{wxComboBox}{wxcombobox} | |
412 | \item \helpref{wxCommandEvent}{wxcommandevent} | |
413 | \item \helpref{wxConfig}{wxconfigbase} | |
414 | \item \helpref{wxControl}{wxcontrol} | |
415 | \item \helpref{wxCursor}{wxcursor} | |
416 | \item \helpref{wxDC}{wxdc} | |
417 | \item \helpref{wxDialog}{wxdialog} | |
418 | \item \helpref{wxDirDialog}{wxdirdialog} | |
419 | \item \helpref{wxDropFilesEvent}{wxdropfilesevent} | |
420 | \item \helpref{wxEraseEvent}{wxeraseevent} | |
421 | \item \helpref{wxEvent}{wxevent} | |
422 | \item \helpref{wxEvtHandler}{wxevthandler} | |
423 | \item \helpref{wxFileDialog}{wxfiledialog} | |
424 | \item \helpref{wxFocusEvent}{wxfocusevent} | |
425 | \item \helpref{wxFontData}{wxfontdata} | |
426 | \item \helpref{wxFontDialog}{wxfontdialog} | |
427 | \item \helpref{wxFont}{wxfont} | |
428 | \item \helpref{wxFrame}{wxframe} | |
429 | \item \helpref{wxGauge}{wxgauge} | |
fd34e3a5 JS |
430 | \item wxGridCell |
431 | \item wxGridEvent | |
06d20283 | 432 | \item \helpref{wxGrid}{wxgrid} |
fd34e3a5 | 433 | \item wxIconizeEvent |
06d20283 RD |
434 | \item \helpref{wxIcon}{wxicon} |
435 | \item \helpref{wxIdleEvent}{wxidleevent} | |
436 | \item \helpref{wxImageList}{wximagelist} | |
437 | \item \helpref{wxIndividualLayoutConstraint}{wxindividuallayoutconstraint} | |
438 | \item \helpref{wxInitDialogEvent}{wxinitdialogevent} | |
439 | \item \helpref{wxJoystickEvent}{wxjoystickevent} | |
440 | \item \helpref{wxKeyEvent}{wxkeyevent} | |
441 | \item \helpref{wxLayoutAlgorithm}{wxlayoutalgorithm} | |
442 | \item \helpref{wxLayoutConstraints}{wxlayoutconstraints} | |
443 | \item \helpref{wxListBox}{wxlistbox} | |
444 | \item \helpref{wxListCtrl}{wxlistctrl} | |
445 | \item \helpref{wxListEvent}{wxlistevent} | |
21f280f4 | 446 | \item \helpref{wxListItem}{wxlistctrlsetitem} |
06d20283 RD |
447 | \item \helpref{wxMDIChildFrame}{wxmdichildframe} |
448 | \item \helpref{wxMDIClientWindow}{wxmdiclientwindow} | |
449 | \item \helpref{wxMDIParentFrame}{wxmdiparentframe} | |
450 | \item \helpref{wxMask}{wxmask} | |
fd34e3a5 | 451 | \item wxMaximizeEvent |
06d20283 RD |
452 | \item \helpref{wxMemoryDC}{wxmemorydc} |
453 | \item \helpref{wxMenuBar}{wxmenubar} | |
454 | \item \helpref{wxMenuEvent}{wxmenuevent} | |
455 | \item \helpref{wxMenuItem}{wxmenuitem} | |
456 | \item \helpref{wxMenu}{wxmenu} | |
457 | \item \helpref{wxMessageDialog}{wxmessagedialog} | |
458 | \item \helpref{wxMetaFileDC}{wxmetafiledc} | |
459 | \item \helpref{wxMiniFrame}{wxminiframe} | |
460 | \item \helpref{wxMouseEvent}{wxmouseevent} | |
461 | \item \helpref{wxMoveEvent}{wxmoveevent} | |
462 | \item \helpref{wxNotebookEvent}{wxnotebookevent} | |
463 | \item \helpref{wxNotebook}{wxnotebook} | |
464 | \item \helpref{wxPageSetupData}{wxpagesetupdata} | |
465 | \item \helpref{wxPageSetupDialog}{wxpagesetupdialog} | |
466 | \item \helpref{wxPaintDC}{wxpaintdc} | |
467 | \item \helpref{wxPaintEvent}{wxpaintevent} | |
468 | \item \helpref{wxPalette}{wxpalette} | |
469 | \item \helpref{wxPanel}{wxpanel} | |
470 | \item \helpref{wxPen}{wxpen} | |
471 | \item \helpref{wxPoint}{wxpoint} | |
472 | \item \helpref{wxPostScriptDC}{wxpostscriptdc} | |
473 | \item \helpref{wxPrintData}{wxprintdata} | |
474 | \item \helpref{wxPrintDialog}{wxprintdialog} | |
475 | \item \helpref{wxPrinterDC}{wxprinterdc} | |
476 | \item \helpref{wxQueryLayoutInfoEvent}{wxquerylayoutinfoevent} | |
477 | \item \helpref{wxRadioBox}{wxradiobox} | |
478 | \item \helpref{wxRadioButton}{wxradiobutton} | |
479 | \item \helpref{wxRealPoint}{wxrealpoint} | |
480 | \item \helpref{wxRect}{wxrect} | |
481 | \item \helpref{wxRegionIterator}{wxregioniterator} | |
482 | \item \helpref{wxRegion}{wxregion} | |
483 | \item \helpref{wxSashEvent}{wxsashevent} | |
484 | \item \helpref{wxSashLayoutWindow}{wxsashlayoutwindow} | |
485 | \item \helpref{wxSashWindow}{wxsashwindow} | |
486 | \item \helpref{wxScreenDC}{wxscreendc} | |
487 | \item \helpref{wxScrollBar}{wxscrollbar} | |
488 | \item \helpref{wxScrollEvent}{wxscrollevent} | |
489 | \item \helpref{wxScrolledWindow}{wxscrolledwindow} | |
fd34e3a5 | 490 | \item wxShowEvent |
06d20283 RD |
491 | \item \helpref{wxSingleChoiceDialog}{wxsinglechoicedialog} |
492 | \item \helpref{wxSizeEvent}{wxsizeevent} | |
493 | \item \helpref{wxSize}{wxsize} | |
494 | \item \helpref{wxSlider}{wxslider} | |
495 | \item \helpref{wxSpinButton}{wxspinbutton} | |
fd34e3a5 | 496 | \item wxSpinEvent |
06d20283 RD |
497 | \item \helpref{wxSplitterWindow}{wxsplitterwindow} |
498 | \item \helpref{wxStaticBitmap}{wxstaticbitmap} | |
499 | \item \helpref{wxStaticBox}{wxstaticbox} | |
500 | \item \helpref{wxStaticText}{wxstatictext} | |
501 | \item \helpref{wxStatusBar}{wxstatusbar} | |
502 | \item \helpref{wxSysColourChangedEvent}{wxsyscolourchangedevent} | |
503 | \item \helpref{wxTaskBarIcon}{wxtaskbaricon} | |
504 | \item \helpref{wxTextCtrl}{wxtextctrl} | |
505 | \item \helpref{wxTextEntryDialog}{wxtextentrydialog} | |
506 | \item \helpref{wxTimer}{wxtimer} | |
fd34e3a5 | 507 | \item wxToolBarTool |
06d20283 | 508 | \item \helpref{wxToolBar}{wxtoolbar} |
fd34e3a5 | 509 | \item wxToolTip |
06d20283 RD |
510 | \item \helpref{wxTreeCtrl}{wxtreectrl} |
511 | \item \helpref{wxTreeEvent}{wxtreeevent} | |
512 | \item \helpref{wxTreeItemData}{wxtreeitemdata} | |
fd34e3a5 | 513 | \item wxTreeItemId |
06d20283 RD |
514 | \item \helpref{wxUpdateUIEvent}{wxupdateuievent} |
515 | \item \helpref{wxWindowDC}{wxwindowdc} | |
516 | \item \helpref{wxWindow}{wxwindow} | |
517 | \end{itemize} | |
518 | ||
519 | %---------------------------------------------------------------------- | |
520 | \section{Where to go for help}\label{wxphelp} | |
521 | ||
522 | Since wxPython is a blending of multiple technologies, help comes from | |
523 | multiple sources. See | |
524 | \urlref{http://alldunn.com/wxPython}{http://alldunn.com/wxPython} for details on | |
525 | various sources of help, but probably the best source is the | |
526 | wxPython-users mail list. You can view the archive or subscribe by | |
527 | going to | |
528 | ||
529 | \urlref{http://starship.python.net/mailman/listinfo/wxpython-users}{http://starship.python.net/mailman/listinfo/wxpython-users} | |
530 | ||
531 | Or you can send mail directly to the list using this address: | |
532 | ||
533 | wxpython-users@starship.python.net | |
534 | ||
535 | ||
536 | ||
537 | ||
538 | ||
539 |