?? wxpython.tex
字號:
\section{wxPython overview}\label{wxpython}%\setheader{{\it CHAPTER \thechapter}}{}{}{}{}{{\it CHAPTER \thechapter}}%%\setfooter{\thepage}{}{}{}{}{\thepage}%This topic was written by Robin Dunn, author of the wxPython wrapper.%----------------------------------------------------------------------\subsection{What is wxPython?}\label{wxpwhat}wxPython is a blending of the wxWidgets GUI classes and the\urlref{Python}{http://www.python.org/} programming language.\wxheading{Python}So what is Python? Go to\urlref{http://www.python.org}{http://www.python.org} to learn more,but in a nutshell Python is an interpreted,interactive, object-oriented programming language. It is oftencompared to Tcl, Perl, Scheme or Java.Python combines remarkable power with very clear syntax. It hasmodules, classes, exceptions, very high level dynamic data types, anddynamic typing. There are interfaces to many system calls andlibraries, and new built-in modules are easily written in C orC++. Python is also usable as an extension language for applicationsthat need a programmable interface.Python is copyrighted but freely usable and distributable, even forcommercial use.\wxheading{wxPython}wxPython is a Python package that can be imported at runtime thatincludes a collection of Python modules and an extension module(native code). It provides a series of Python classes that mirror (orshadow) many of the wxWidgets GUI classes. This extension moduleattempts to mirror the class hierarchy of wxWidgets as closely aspossible. This means that there is a wxFrame class in wxPython thatlooks, smells, tastes and acts almost the same as the wxFrame class inthe C++ version.wxPython is very versatile. It can be used to create standalone GUIapplications, 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 GTKtoolkit (wxGTK) on most Unix/X-windows platforms. See the wxPythonwebsite \urlref{http://wxPython.org/}{http://wxPython.org/} fordetails about getting wxPython working for you.%----------------------------------------------------------------------\subsection{Why use wxPython?}\label{wxpwhy}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 Iabsolutely have to eke more performance out of an algorithm, and eventhen I usually code it as an extension module and leave the majorityof the program in Python.Another good thing to use wxPython for is quick prototyping of yourwxWidgets apps. With C++ you have to continuously go though theedit-compile-link-run cycle, which can be quite time consuming. WithPython it is only an edit-run cycle. You can easily build anapplication in a few hours with Python that would normally take a fewdays or longer with C++. Converting a wxPython app to a C++/wxWidgets appshould be a straight forward task.%----------------------------------------------------------------------\subsection{Other Python GUIs}\label{wxpother}There are other GUI solutions out there for Python.\wxheading{Tkinter}Tkinter is the de facto standard GUI for Python. It is availableon 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 its upsides and its downsides...The upside is that Tk is a pretty versatile toolkit. It can be madeto do a lot of things in a lot of different environments. It is fairlyeasy to create new widgets and use them interchangeably in yourprograms.The downside is Tcl. When using Tkinter you actually have twoseparate language interpreters running, the Python interpreter and theTcl interpreter for the GUI. Since the guts of Tcl is mostly aboutstring processing, it is fairly slow as well. (Not too bad on a fastPentium II, but you really notice the difference on slower machines.)It wasn't until the latest version of Tcl/Tk that native Look andFeel was possible on non-Motif platforms. This is because Tkusually implements its own widgets (controls) even when there arenative 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 higherlevel of abstraction.\wxheading{PythonWin}PythonWin is an add-on package for Python for the Win32 platform. Itincludes wrappers for MFC as well as much of the Win32 API. Becauseof its foundation, it is very familiar for programmers who haveexperience with MFC and the Win32 API. It is obviously not compatiblewith other platforms and toolkits. PythonWin is organized as separatepackages and modules so you can use the pieces you need without havingto use the GUI portions.\wxheading{Others}There are quite a few other GUI modules available for Python, some inactive use, some that haven't been updated for ages. Most are simplewrappers around some C or C++ toolkit or another, and most are notcross-platform compatible. See \urlref{this link}{http://www.python.org/download/Contributed.html\#Graphics}for a listing of a few of them.%----------------------------------------------------------------------\subsection{Using wxPython}\label{wxpusing}\wxheading{First things first...}I'm not going to try and teach the Python language here. You can dothat at the \urlref{Python Tutorial}{http://www.python.org/doc/tut/tut.html}.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 similarprogram in the {\tt wxPython/demo} directory, named {\tt DialogUnits.py}. If yourPython and wxPython are properly installed, you should be able to runit by issuing this command:\begin{indented}{1cm} {\bf\tt python DialogUnits.py}\end{indented}\hrule\begin{verbatim}001: ## import all of the wxPython GUI package002: from wxPython.wx import *003:004: ## Create a new frame class, derived from the wxPython Frame.005: class MyFrame(wxFrame):006:007: def __init__(self, parent, id, title):008: # First, call the base class' __init__ method to create the frame009: wxFrame.__init__(self, parent, id, title,010: wxPoint(100, 100), wxSize(160, 100))011:012: # Associate some events with methods of this class013: EVT_SIZE(self, self.OnSize)014: EVT_MOVE(self, self.OnMove)015:016: # Add a panel and some controls to display the size and position017: panel = wxPanel(self, -1)018: wxStaticText(panel, -1, "Size:",019: wxDLG_PNT(panel, wxPoint(4, 4)), wxDefaultSize)020: wxStaticText(panel, -1, "Pos:",021: wxDLG_PNT(panel, wxPoint(4, 14)), wxDefaultSize)022: self.sizeCtrl = wxTextCtrl(panel, -1, "",023: wxDLG_PNT(panel, wxPoint(24, 4)),024: wxDLG_SZE(panel, wxSize(36, -1)),025: wxTE_READONLY)026: self.posCtrl = wxTextCtrl(panel, -1, "",027: wxDLG_PNT(panel, wxPoint(24, 14)),028: wxDLG_SZE(panel, wxSize(36, -1)),029: wxTE_READONLY)030:031:032: # This method is called automatically when the CLOSE event is033: # sent to this window034: def OnCloseWindow(self, event):035: # tell the window to kill itself036: self.Destroy()037:038: # This method is called by the system when the window is resized,039: # because of the association above.040: def OnSize(self, event):041: size = event.GetSize()042: self.sizeCtrl.SetValue("%s, %s" % (size.width, size.height))043:044: # tell the event system to continue looking for an event handler,045: # so the default handler will get called.046: event.Skip()047:048: # This method is called by the system when the window is moved,049: # because of the association above.050: def OnMove(self, event):051: pos = event.GetPosition()052: self.posCtrl.SetValue("%s, %s" % (pos.x, pos.y))053:054:055: # Every wxWidgets application must have a class derived from wxApp056: class MyApp(wxApp):057:058: # wxWidgets calls this method to initialize the application059: def OnInit(self):060:061: # Create an instance of our customized Frame class062: frame = MyFrame(NULL, -1, "This is a test")063: frame.Show(true)064:065: # Tell wxWidgets that this is our main window066: self.SetTopWindow(frame)067:068: # Return a success flag069: return true070:071:072: app = MyApp(0) # Create an instance of the application class073: app.MainLoop() # Tell it to start processing events074:\end{verbatim}\hrule\wxheading{Things to notice}\begin{enumerate}\itemsep=11pt\item At line 2 the wxPython classes, constants, and etc. are importedinto the current module's namespace. If you prefer to reducenamespace pollution you can use "{\tt from wxPython import wx}" andthen access all the wxPython identifiers through the wx module, forexample, "{\tt wx.wxFrame}".\item At line 13 the frame's sizing and moving events are connected tomethods of the class. These helper functions are intended to be likethe event table macros that wxWidgets employs. But since static eventtables are impossible with wxPython, we use helpers that are named thesame to dynamically build the table. The only real difference isthat the first argument to the event helpers is always the window thatthe event table entry should be added to.\item Notice the use of {\tt wxDLG\_PNT} and {\tt wxDLG\_SZE} in lines 19- 29 to convert from dialog units to pixels. These helpers are uniqueto wxPython since Python can't do method overloading like C++.\item There is an {\tt OnCloseWindow} method at line 34 but no call toEVT\_CLOSE to attach the event to the method. Does it really getcalled? The answer is, yes it does. This is because many of the{\em standard} events are attached to windows that have the associated{\em standard} method names. I have tried to follow the lead of theC++ classes in this area to determine what is {\em standard} but sincethat changes from time to time I can make no guarantees, nor will it
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -