| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458 |
- /////////////////////////////////////////////////////////////////////////////
- // Name: python.h
- // Purpose: topic overview
- // Author: wxWidgets team
- // Licence: wxWindows licence
- /////////////////////////////////////////////////////////////////////////////
- /**
- @page overview_python wxPython Overview
- @tableofcontents
- This topic was written by Robin Dunn, author of the
- <a href="http://www.python.org/">wxPython</a> wrapper.
- @section overview_python_what What is wxPython?
- wxPython is a blending of the wxWidgets GUI classes and the Python programming
- language.
- @subsection overview_python_what_py Python
- So what is Python? Go to http://www.python.org to learn more, but in a
- nutshell Python is an interpreted, interactive, object-oriented programming
- language. It is often compared to Tcl, Perl, Scheme or Java.
- Python combines remarkable power with very clear syntax. It has modules,
- classes, exceptions, very high level dynamic data types, and dynamic typing.
- There are interfaces to many system calls and libraries, and new built-in
- modules are easily written in C or C++. Python is also usable as an extension
- language for applications that need a programmable interface.
- Python is copyrighted but freely usable and distributable, even for commercial
- use.
- @subsection overview_python_what_wxpy wxPython
- wxPython is a Python package that can be imported at runtime that includes a
- collection of Python modules and an extension module (native code). It provides
- a series of Python classes that mirror (or shadow) many of the wxWidgets GUI
- classes. This extension module attempts to mirror the class hierarchy of
- wxWidgets as closely as possible. This means that there is a wxFrame class in
- wxPython that looks, smells, tastes and acts almost the same as the wxFrame
- class in the C++ version.
- wxPython is very versatile. It can be used to create standalone GUI
- applications, or in situations where Python is embedded in a C++ application as
- an internal scripting or macro language.
- Currently wxPython is available for Win32 platforms and the GTK toolkit (wxGTK)
- on most Unix/X-windows platforms. See the wxPython website http://wxPython.org/
- for details about getting wxPython working for you.
- @section overview_python_why Why Use wxPython?
- So why would you want to use wxPython over just C++ and wxWidgets? Personally I
- prefer using Python for everything. I only use C++ when I absolutely have to
- eke more performance out of an algorithm, and even then I usually code it as an
- extension module and leave the majority of the program in Python.
- Another good thing to use wxPython for is quick prototyping of your wxWidgets
- apps. With C++ you have to continuously go though the edit-compile-link-run
- cycle, which can be quite time consuming. With Python it is only an edit-run
- cycle. You can easily build an application in a few hours with Python that
- would normally take a few days or longer with C++. Converting a wxPython app to
- a C++/wxWidgets app should be a straight forward task.
- @section overview_python_othergui Other Python GUIs
- There are other GUI solutions out there for Python.
- @subsection overview_python_othergui_tkinter Tkinter
- Tkinter is the de facto standard GUI for Python. It is available on nearly
- every platform that Python and Tcl/TK are. Why Tcl/Tk? Well because Tkinter is
- just a wrapper around Tcl's GUI toolkit, Tk. This has it's upsides and it's
- downsides...
- The upside is that Tk is a pretty versatile toolkit. It can be made to do a lot
- of things in a lot of different environments. It is fairly easy to create new
- widgets and use them interchangeably in your programs.
- The downside is Tcl. When using Tkinter you actually have two separate language
- interpreters running, the Python interpreter and the Tcl interpreter for the
- GUI. Since the guts of Tcl is mostly about string processing, it is fairly slow
- as well. (Not too bad on a fast Pentium II, but you really notice the
- difference on slower machines.)
- It wasn't until the latest version of Tcl/Tk that native Look and Feel was
- possible on non-Motif platforms. This is because Tk usually implements its own
- widgets (controls) even when there are native controls available.
- Tkinter is a pretty low-level toolkit. You have to do a lot of work (verbose
- program code) to do things that would be much simpler with a higher level of
- abstraction.
- @subsection overview_python_othergui_pythonwin PythonWin
- PythonWin is an add-on package for Python for the Win32 platform. It includes
- wrappers for MFC as well as much of the Win32 API. Because of its foundation,
- it is very familiar for programmers who have experience with MFC and the Win32
- API. It is obviously not compatible with other platforms and toolkits.
- PythonWin is organized as separate packages and modules so you can use the
- pieces you need without having to use the GUI portions.
- @subsection overview_python_othergui_others Others
- There are quite a few other GUI modules available for Python, some in active
- use, some that haven't been updated for ages. Most are simple wrappers around
- some C or C++ toolkit or another, and most are not cross-platform compatible.
- See <a href="http://pypi.python.org/pypi?:action=browse&show=all&c=433">this link</a>
- for a listing of a few of them.
- @section overview_python_using Using wxPython
- I'm not going to try and teach the Python language here. You can do that at the
- <a href="http://www.python.org/doc/tut/tut.html">Python Tutorial</a>. I'm also
- going to assume that you know a bit about wxWidgets already, enough to notice
- the similarities in the classes used.
- Take a look at the following wxPython program. You can find a similar program
- in the @c wxPython/demo directory, named @c DialogUnits.py. If your Python and
- wxPython are properly installed, you should be able to run it by issuing this
- command:
- @code
- python DialogUnits.py
- @endcode
- @code
- 01: ## import all of the wxPython GUI package
- 02: from wxPython.wx import *
- 03:
- 04: ## Create a new frame class, derived from the wxPython Frame.
- 05: class MyFrame(wxFrame):
- 06:
- 07: def __init__(self, parent, id, title):
- 08: # First, call the base class' __init__ method to create the frame
- 09: wxFrame.__init__(self, parent, id, title,
- 10: wxPoint(100, 100), wxSize(160, 100))
- 11:
- 12: # Associate some events with methods of this class
- 13: EVT_SIZE(self, self.OnSize)
- 14: EVT_MOVE(self, self.OnMove)
- 15:
- 16: # Add a panel and some controls to display the size and position
- 17: panel = wxPanel(self, -1)
- 18: wxStaticText(panel, -1, "Size:",
- 19: wxDLG_PNT(panel, wxPoint(4, 4)), wxDefaultSize)
- 20: wxStaticText(panel, -1, "Pos:",
- 21: wxDLG_PNT(panel, wxPoint(4, 14)), wxDefaultSize)
- 22: self.sizeCtrl = wxTextCtrl(panel, -1, "",
- 23: wxDLG_PNT(panel, wxPoint(24, 4)),
- 24: wxDLG_SZE(panel, wxSize(36, -1)),
- 25: wxTE_READONLY)
- 26: self.posCtrl = wxTextCtrl(panel, -1, "",
- 27: wxDLG_PNT(panel, wxPoint(24, 14)),
- 28: wxDLG_SZE(panel, wxSize(36, -1)),
- 29: wxTE_READONLY)
- 30:
- 31:
- 32: # This method is called automatically when the CLOSE event is
- 33: # sent to this window
- 34: def OnCloseWindow(self, event):
- 35: # tell the window to kill itself
- 36: self.Destroy()
- 37:
- 38: # This method is called by the system when the window is resized,
- 39: # because of the association above.
- 40: def OnSize(self, event):
- 41: size = event.GetSize()
- 42: self.sizeCtrl.SetValue("%s, %s" % (size.width, size.height))
- 43:
- 44: # tell the event system to continue looking for an event handler,
- 45: # so the default handler will get called.
- 46: event.Skip()
- 47:
- 48: # This method is called by the system when the window is moved,
- 49: # because of the association above.
- 50: def OnMove(self, event):
- 51: pos = event.GetPosition()
- 52: self.posCtrl.SetValue("%s, %s" % (pos.x, pos.y))
- 53:
- 54:
- 55: # Every wxWidgets application must have a class derived from wxApp
- 56: class MyApp(wxApp):
- 57:
- 58: # wxWidgets calls this method to initialize the application
- 59: def OnInit(self):
- 60:
- 61: # Create an instance of our customized Frame class
- 62: frame = MyFrame(NULL, -1, "This is a test")
- 63: frame.Show(true)
- 64:
- 67:
- 68: # Return a success flag
- 69: return true
- 70:
- 71:
- 72: app = MyApp(0) # Create an instance of the application class
- 73: app.MainLoop() # Tell it to start processing events
- 74:
- @endcode
- @subsection overview_python_using_notice Things to Notice
- At line 2 the wxPython classes, constants, and etc. are imported into the
- current module's namespace. If you prefer to reduce namespace pollution you can
- use @c "from wxPython import wx" and then access all the wxPython identifiers
- through the wx module, for example, @c "wx.wxFrame".
- At line 13 the frame's sizing and moving events are connected to methods of the
- class. These helper functions are intended to be like the event table macros
- that wxWidgets employs. But since static event tables are impossible with
- wxPython, we use helpers that are named the same to dynamically build the
- table. The only real difference is that the first argument to the event helpers
- is always the window that the event table entry should be added to.
- Notice the use of @c wxDLG_PNT and @c wxDLG_SZE in lines 19-29 to convert from
- dialog units to pixels. These helpers are unique to wxPython since Python can't
- do method overloading like C++.
- There is an @c OnCloseWindow method at line 34 but no call to @c EVT_CLOSE to
- attach the event to the method. Does it really get called? The answer is, yes
- it does. This is because many of the standard events are attached to windows
- that have the associated standard method names. I have tried to follow the lead
- of the C++ classes in this area to determine what is standard but since that
- changes from time to time I can make no guarantees, nor will it be fully
- documented. When in doubt, use an @c EVT_*** function.
- At lines 17 to 21 notice that there are no saved references to the panel or the
- static text items that are created. Those of you who know Python might be
- wondering what happens when Python deletes these objects when they go out of
- scope. Do they disappear from the GUI? They don't. Remember that in wxPython
- the Python objects are just shadows of the corresponding C++ objects. Once the
- C++ windows and controls are attached to their parents, the parents manage them
- and delete them when necessary. For this reason, most wxPython objects do not
- need to have a @c __del__ method that explicitly causes the C++ object to be
- deleted. If you ever have the need to forcibly delete a window, use the
- Destroy() method as shown on line 36.
- Just like wxWidgets in C++, wxPython apps need to create a class derived from
- @c wxApp (line 56) that implements a method named @c OnInit, (line 59.) This
- method should create the application's main window (line 62) and show it.
- And finally, at line 72 an instance of the application class is created. At
- this point wxPython finishes initializing itself, and calls the @c OnInit
- method to get things started. (The zero parameter here is a flag for
- functionality that isn't quite implemented yet. Just ignore it for now.) The
- call to @c MainLoop at line 73 starts the event loop which continues until the
- application terminates or all the top level windows are closed.
- @section overview_python_classes Classes Implemented in wxPython
- The following classes are supported in wxPython. Most provide nearly full
- implementations of the public interfaces specified in the C++ documentation,
- others are less so. They will all be brought as close as possible to the C++
- spec over time.
- @li wxAcceleratorEntry
- @li wxAcceleratorTable
- @li wxActivateEvent
- @li wxBitmap
- @li wxBitmapButton
- @li wxBitmapDataObject
- @li wxBMPHandler
- @li wxBoxSizer
- @li wxBrush
- @li wxBusyInfo
- @li wxBusyCursor
- @li wxButton
- @li wxCalculateLayoutEvent
- @li wxCalendarCtrl
- @li wxCaret
- @li wxCheckBox
- @li wxCheckListBox
- @li wxChoice
- @li wxClientDC
- @li wxClipboard
- @li wxCloseEvent
- @li wxColourData
- @li wxColourDialog
- @li wxColour
- @li wxComboBox
- @li wxCommandEvent
- @li wxConfigBase
- @li wxControl
- @li wxCursor
- @li wxCustomDataObject
- @li wxDataFormat
- @li wxDataObject
- @li wxDataObjectComposite
- @li wxDataObjectSimple
- @li wxDateTime
- @li wxDateSpan
- @li wxDC
- @li wxDialog
- @li wxDirDialog
- @li wxDragImage
- @li wxDropFilesEvent
- @li wxDropSource
- @li wxDropTarget
- @li wxEraseEvent
- @li wxEvent
- @li wxEvtHandler
- @li wxFileConfig
- @li wxFileDataObject
- @li wxFileDialog
- @li wxFileDropTarget
- @li wxFileSystem
- @li wxFileSystemHandler
- @li wxFocusEvent
- @li wxFontData
- @li wxFontDialog
- @li wxFont
- @li wxFrame
- @li wxFSFile
- @li wxGauge
- @li wxGIFHandler
- @li wxGLCanvas
- @li wxHtmlCell
- @li wxHtmlContainerCell
- @li wxHtmlDCRenderer
- @li wxHtmlEasyPrinting
- @li wxHtmlParser
- @li wxHtmlTagHandler
- @li wxHtmlTag
- @li wxHtmlWinParser
- @li wxHtmlPrintout
- @li wxHtmlWinTagHandler
- @li wxHtmlWindow
- @li wxIconizeEvent
- @li wxIcon
- @li wxIdleEvent
- @li wxImage
- @li wxImageHandler
- @li wxImageList
- @li wxIndividualLayoutConstraint
- @li wxInitDialogEvent
- @li wxInputStream
- @li @ref wxFileSystem "wxInternetFSHandler"
- @li wxJoystickEvent
- @li wxJPEGHandler
- @li wxKeyEvent
- @li wxLayoutAlgorithm
- @li wxLayoutConstraints
- @li wxListBox
- @li wxListCtrl
- @li wxListEvent
- @li wxListItem
- @li wxMask
- @li wxMaximizeEvent
- @li wxMDIChildFrame
- @li wxMDIClientWindow
- @li wxMDIParentFrame
- @li wxMemoryDC
- @li wxMemoryFSHandler
- @li wxMenuBar
- @li wxMenuEvent
- @li wxMenuItem
- @li wxMenu
- @li wxMessageDialog
- @li wxMetafileDC
- @li wxMiniFrame
- @li wxMouseEvent
- @li wxMoveEvent
- @li wxNotebookEvent
- @li wxNotebook
- @li wxPageSetupDialogData
- @li wxPageSetupDialog
- @li wxPaintDC
- @li wxPaintEvent
- @li wxPalette
- @li wxPanel
- @li wxPen
- @li wxPNGHandler
- @li wxPoint
- @li wxPostScriptDC
- @li wxPreviewFrame
- @li wxPrintData
- @li wxPrintDialogData
- @li wxPrintDialog
- @li wxPrinter
- @li wxPrintPreview
- @li wxPrinterDC
- @li wxPrintout
- @li wxProcess
- @li wxQueryLayoutInfoEvent
- @li wxRadioBox
- @li wxRadioButton
- @li wxRealPoint
- @li wxRect
- @li wxRegionIterator
- @li wxRegion
- @li wxSashEvent
- @li wxSashLayoutWindow
- @li wxSashWindow
- @li wxScreenDC
- @li wxScrollBar
- @li wxScrollEvent
- @li ::wxScrolledWindow
- @li wxScrollWinEvent
- @li wxShowEvent
- @li wxSingleChoiceDialog
- @li wxSizeEvent
- @li wxSize
- @li wxSizer
- @li wxSizerItem
- @li wxSlider
- @li wxSpinButton
- @li wxSpinEvent
- @li wxSplitterWindow
- @li wxStaticBitmap
- @li wxStaticBox
- @li wxStaticBoxSizer
- @li wxStaticLine
- @li wxStaticText
- @li wxStatusBar
- @li wxSysColourChangedEvent
- @li wxTaskBarIcon
- @li wxTextCtrl
- @li wxTextDataObject
- @li wxTextDropTarget
- @li wxTextEntryDialog
- @li wxTimer
- @li wxTimerEvent
- @li wxTimeSpan
- @li wxTipProvider
- @li wxToolBarTool
- @li wxToolBar
- @li wxToolTip
- @li wxTreeCtrl
- @li wxTreeEvent
- @li wxTreeItemData
- @li wxTreeItemId
- @li wxUpdateUIEvent
- @li wxValidator
- @li wxWindowDC
- @li wxWindow
- @li @ref wxFileSystem "wxZipFSHandler"
- @section overview_python_help Where to Go for Help
- Since wxPython is a blending of multiple technologies, help comes from multiple
- sources. See http://wxpython.org/ for details on various sources of help, but
- probably the best source is the wxPython-users mail list. You can view the
- archive or subscribe by going to http://wxpython.org/maillist.php
- Or you can send mail directly to the list using this address:
- wxpython-users@lists.wxwidgets.org
- */
|