1fded56b37
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@21593 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
291 lines
13 KiB
HTML
291 lines
13 KiB
HTML
<?xml version="1.0" encoding="iso-8859-1" ?>
|
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
|
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
|
<head>
|
|
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
|
|
<meta name="generator" content="Docutils 0.2.8: http://docutils.sourceforge.net/" />
|
|
<title>The wxPython wx Package</title>
|
|
<meta name="author" content="Patrick K. O'Brien" />
|
|
<meta name="organization" content="Orbtech" />
|
|
<meta name="date" content="2003-05-08" />
|
|
<link rel="stylesheet" href="default.css" type="text/css" />
|
|
</head>
|
|
<body>
|
|
<div class="document" id="the-wxpython-wx-package">
|
|
<h1 class="title">The wxPython wx Package</h1>
|
|
<h2 class="subtitle" id="or-how-to-survive-the-new-wx-namespace-changes">Or, how to survive the new wx namespace changes.</h2>
|
|
<table class="docinfo" frame="void" rules="none">
|
|
<col class="docinfo-name" />
|
|
<col class="docinfo-content" />
|
|
<tbody valign="top">
|
|
<tr><th class="docinfo-name">Author:</th>
|
|
<td>Patrick K. O'Brien</td></tr>
|
|
<tr><th class="docinfo-name">Contact:</th>
|
|
<td><a class="first last reference" href="mailto:pobrien@orbtech.com">pobrien@orbtech.com</a></td></tr>
|
|
<tr><th class="docinfo-name">Organization:</th>
|
|
<td><a class="first last reference" href="http://www.orbtech.com/">Orbtech</a></td></tr>
|
|
<tr><th class="docinfo-name">Date:</th>
|
|
<td>2003-05-08</td></tr>
|
|
<tr><th class="docinfo-name">Revision:</th>
|
|
<td>1.1.2.4</td></tr>
|
|
</tbody>
|
|
</table>
|
|
<div class="contents topic" id="contents">
|
|
<p class="topic-title"><a name="contents">Contents</a></p>
|
|
<ul class="simple">
|
|
<li><a class="reference" href="#introduction" id="id1" name="id1">Introduction</a></li>
|
|
<li><a class="reference" href="#why-change-anything" id="id2" name="id2">Why change anything?</a></li>
|
|
<li><a class="reference" href="#what-does-the-new-wx-package-do" id="id3" name="id3">What does the new wx package do?</a></li>
|
|
<li><a class="reference" href="#will-any-of-this-effect-my-existing-code" id="id4" name="id4">Will any of this effect my existing code?</a></li>
|
|
<li><a class="reference" href="#how-does-the-new-wx-package-work" id="id5" name="id5">How does the new wx package work?</a></li>
|
|
<li><a class="reference" href="#what-about-all-the-other-modules-like-grid-html-and-stc" id="id6" name="id6">What about all the other modules, like grid, html, and stc?</a></li>
|
|
<li><a class="reference" href="#how-do-i-use-this-new-wx-package" id="id7" name="id7">How do I use this new wx package?</a></li>
|
|
<li><a class="reference" href="#what-are-the-issues-with-converting-old-code-to-use-the-new-wx-package" id="id8" name="id8">What are the issues with converting old code to use the new wx package?</a></li>
|
|
<li><a class="reference" href="#where-can-i-find-example-programs-using-the-new-wx-syntax" id="id9" name="id9">Where can I find example programs using the new wx syntax?</a></li>
|
|
</ul>
|
|
</div>
|
|
<div class="section" id="introduction">
|
|
<h1><a class="toc-backref" href="#id1" name="introduction">Introduction</a></h1>
|
|
<p>Big things sometimes come in small packages. This is certainly true
|
|
of the new wx package, which is being introduced in wxPython 2.4.1 as
|
|
a way to allow the "wx" prefix to be dropped from the names of all
|
|
wxPython classes, functions, and constants. This document should
|
|
answer all the questions you might have concerning the new wx package.
|
|
If not, feel free to contact the author. I hope you like the new wx
|
|
package as much as I do.</p>
|
|
</div>
|
|
<div class="section" id="why-change-anything">
|
|
<h1><a class="toc-backref" href="#id2" name="why-change-anything">Why change anything?</a></h1>
|
|
<p>This change is being made for a couple of reasons. The first reason
|
|
is to discourage the use of <tt class="literal"><span class="pre">import</span> <span class="pre">*</span></tt>, which is a dangerous
|
|
technique that can create name conflicts and bloated namespaces.</p>
|
|
<p>The second reason is to remove what some perceive to be a "wart." For
|
|
example, the following code is rather ugly in that the "wx" prefix on
|
|
the wxFrame class name is no longer useful when you're using the wx
|
|
module prefix:</p>
|
|
<pre class="literal-block">
|
|
from wxPython import wx
|
|
|
|
class Frame(wx.wxFrame)
|
|
</pre>
|
|
<p>The new wx package allows you to write code like this, instead:</p>
|
|
<pre class="literal-block">
|
|
import wx
|
|
|
|
class Frame(wx.Frame)
|
|
</pre>
|
|
<p>The third reason is that the wxWindows project intends to do the same
|
|
thing (implement a new wx namespace and drop the "wx" prefix) and we
|
|
want wxPython to lead the way.</p>
|
|
</div>
|
|
<div class="section" id="what-does-the-new-wx-package-do">
|
|
<h1><a class="toc-backref" href="#id3" name="what-does-the-new-wx-package-do">What does the new wx package do?</a></h1>
|
|
<p>As a way of getting to this new syntax as quickly as possible, the
|
|
code in this new wx package was created. What it does is alter the
|
|
existing wx namespace dynamically. By making the changes on-the-fly
|
|
at runtime, we can try out the new syntax before any permanent changes
|
|
are made to the underlying class library. The downside of making
|
|
these changes at runtime is that there is a slight delay when you
|
|
<tt class="literal"><span class="pre">import</span> <span class="pre">wx</span></tt>; the upside is that you can start using the new syntax
|
|
now.</p>
|
|
</div>
|
|
<div class="section" id="will-any-of-this-effect-my-existing-code">
|
|
<h1><a class="toc-backref" href="#id4" name="will-any-of-this-effect-my-existing-code">Will any of this effect my existing code?</a></h1>
|
|
<p>No. Your existing code will continue to work and be supported for
|
|
some time. It will be up to you to decide when to switch to the new
|
|
syntax. But all new documentation and code examples will use the new
|
|
syntax. So don't wait too long. You wouldn't want anyone calling you
|
|
old-fashioned, would you?</p>
|
|
</div>
|
|
<div class="section" id="how-does-the-new-wx-package-work">
|
|
<h1><a class="toc-backref" href="#id5" name="how-does-the-new-wx-package-work">How does the new wx package work?</a></h1>
|
|
<p>It's pretty simple, and pretty clever. The wx directory contains an
|
|
<tt class="literal"><span class="pre">__init__.py</span></tt> file, making it a Python package. (In contrast, the
|
|
old wxPython.wx module is a module, not a package.) When you <tt class="literal"><span class="pre">import</span>
|
|
<span class="pre">wx</span></tt> the code in the <tt class="literal"><span class="pre">__init__.py</span></tt> file is executed, and that's
|
|
where all the magic takes place. Let's take a look at the code inside
|
|
the <tt class="literal"><span class="pre">__init__.py</span></tt> file:</p>
|
|
<pre class="literal-block">
|
|
"""wx package
|
|
|
|
Provides a way to drop the wx prefix from wxPython objects."""
|
|
|
|
__author__ = "Patrick K. O'Brien <pobrien@orbtech.com>"
|
|
__cvsid__ = "$Id$"
|
|
__revision__ = "$Revision$"[11:-2]
|
|
|
|
from wxPython import wx
|
|
|
|
import types
|
|
|
|
d_new = globals()
|
|
d_old = wx.__dict__
|
|
|
|
for old, obj in d_old.items():
|
|
if type(obj) is types.ModuleType or old.startswith('_'):
|
|
# Skip modules and private names.
|
|
continue
|
|
new = old
|
|
if old.startswith('EVT_'):
|
|
# Leave name unmodified; add to the new wx namespace.
|
|
d_new[new] = obj
|
|
elif old.startswith('wxEVT_'):
|
|
# Leave name unmodified; add to the new wx namespace.
|
|
d_new[new] = obj
|
|
else:
|
|
if old.startswith('wx'):
|
|
# Remove the 'wx' prefix.
|
|
new = old[2:]
|
|
# Add to the new wx package namespace.
|
|
d_new[new] = obj
|
|
|
|
del d_new
|
|
del d_old
|
|
del new
|
|
del obj
|
|
del old
|
|
del types
|
|
|
|
del wx
|
|
|
|
</pre>
|
|
<p>Namespaces in Python are implemented as dictionaries. The dictionary
|
|
used to create the wx package's namespace is accessible using the
|
|
<tt class="literal"><span class="pre">globals()</span></tt> function. The dictionary used to create the old
|
|
wxPython.wx module's namespace is <tt class="literal"><span class="pre">wx.__dict__</span></tt>. Once we have these
|
|
two dictionaries, it's a simple matter of iterating through one,
|
|
changing the names, adding the renamed object to the other dictionary,
|
|
and cleaning up a few local variables and imported modules. Voila!</p>
|
|
</div>
|
|
<div class="section" id="what-about-all-the-other-modules-like-grid-html-and-stc">
|
|
<h1><a class="toc-backref" href="#id6" name="what-about-all-the-other-modules-like-grid-html-and-stc">What about all the other modules, like grid, html, and stc?</a></h1>
|
|
<p>There's more to wxPython than just the wx namespace. And we've got
|
|
those extra modules covered as well. For each of those modules (as
|
|
well as the lib package) we've got matching modules in the new wx
|
|
package. Let's take a look at a few of them.</p>
|
|
<p>Here is <tt class="literal"><span class="pre">html.py</span></tt>:</p>
|
|
<pre class="literal-block">
|
|
"""Provides a way to drop the wx prefix from wxPython objects."""
|
|
|
|
__author__ = "Patrick K. O'Brien <pobrien@orbtech.com>"
|
|
__cvsid__ = "$Id$"
|
|
__revision__ = "$Revision$"[11:-2]
|
|
|
|
import wx
|
|
from wx import prefix
|
|
|
|
from wxPython import html
|
|
prefix.rename(d_new=globals(), d_old=html.__dict__)
|
|
del html
|
|
|
|
del prefix
|
|
del wx
|
|
|
|
</pre>
|
|
<p>And here is <tt class="literal"><span class="pre">lib/dialogs.py</span></tt>:</p>
|
|
<pre class="literal-block">
|
|
"""Provides a way to drop the wx prefix from wxPython objects."""
|
|
|
|
__author__ = "Patrick K. O'Brien <pobrien@orbtech.com>"
|
|
__cvsid__ = "$Id$"
|
|
__revision__ = "$Revision$"[11:-2]
|
|
|
|
import wx
|
|
from wx import prefix
|
|
|
|
from wxPython.lib import dialogs
|
|
prefix.rename(d_new=globals(), d_old=dialogs.__dict__)
|
|
del dialogs
|
|
|
|
del prefix
|
|
del wx
|
|
|
|
</pre>
|
|
<p>As you can see, they both rely on the <tt class="literal"><span class="pre">prefix.rename()</span></tt> function
|
|
defined in <tt class="literal"><span class="pre">prefix.py</span></tt>:</p>
|
|
<pre class="literal-block">
|
|
"""Renaming utility.
|
|
|
|
Provides a way to drop the wx prefix from wxPython objects."""
|
|
|
|
__author__ = "Patrick K. O'Brien <pobrien@orbtech.com>"
|
|
__cvsid__ = "$Id$"
|
|
__revision__ = "$Revision$"[11:-2]
|
|
|
|
import types
|
|
|
|
def rename(d_new, d_old):
|
|
for old, obj in d_old.items():
|
|
if type(obj) is types.ModuleType or old.startswith('_'):
|
|
# Skip modules and private names.
|
|
continue
|
|
## mod = d_old['__name__']
|
|
## if hasattr(obj, '__module__') and not obj.__module__.startswith(mod):
|
|
## # Skip objects imported from other modules, except those
|
|
## # related to the current module, such as stc_.
|
|
## continue
|
|
new = old
|
|
if old.startswith('EVT_') or old.startswith('wxEVT_'):
|
|
# Leave these names unmodified.
|
|
pass
|
|
elif old.startswith('wx'):
|
|
new = old[2:]
|
|
if new:
|
|
d_new[new] = d_old[old]
|
|
|
|
</pre>
|
|
<p>Again, the technique is very similar to the one used by the wx
|
|
package.</p>
|
|
</div>
|
|
<div class="section" id="how-do-i-use-this-new-wx-package">
|
|
<h1><a class="toc-backref" href="#id7" name="how-do-i-use-this-new-wx-package">How do I use this new wx package?</a></h1>
|
|
<p>The wx package is automatically created when you install wxPython
|
|
version 2.4.1 or higher. So all you have to do is:</p>
|
|
<pre class="literal-block">
|
|
import wx
|
|
</pre>
|
|
</div>
|
|
<div class="section" id="what-are-the-issues-with-converting-old-code-to-use-the-new-wx-package">
|
|
<h1><a class="toc-backref" href="#id8" name="what-are-the-issues-with-converting-old-code-to-use-the-new-wx-package">What are the issues with converting old code to use the new wx package?</a></h1>
|
|
<p>Obviously, you need to change your import statements from:</p>
|
|
<pre class="literal-block">
|
|
from wxPython import wx
|
|
</pre>
|
|
<p>or:</p>
|
|
<pre class="literal-block">
|
|
from wxPython.wx import *
|
|
</pre>
|
|
<p>to:</p>
|
|
<pre class="literal-block">
|
|
import wx
|
|
</pre>
|
|
<p>Then you need to refer to wx attributes without a "wx" prefix, such
|
|
as:</p>
|
|
<pre class="literal-block">
|
|
class MyFrame(wx.Frame):
|
|
</pre>
|
|
<p>In most cases, existing code can be modified with a simple search and
|
|
replace.</p>
|
|
<p>One extra issue you might run into when converting existing code is
|
|
that the wx.__version__ attribute is no longer available, since the
|
|
new wx namespace doesn't include any private attributes from the old
|
|
wxPython.wx namespace. The solution is to use the wx.VERSION_STRING
|
|
attribute, which was introduced in wxPython 2.4.1.</p>
|
|
</div>
|
|
<div class="section" id="where-can-i-find-example-programs-using-the-new-wx-syntax">
|
|
<h1><a class="toc-backref" href="#id9" name="where-can-i-find-example-programs-using-the-new-wx-syntax">Where can I find example programs using the new wx syntax?</a></h1>
|
|
<p>Example programs are included in the wxPython/samples/wx_examples
|
|
directory, and are documented in the <a class="reference" href="wxPythonExamples.html">wxPythonExamples</a> documentation
|
|
file. Also, all the code in the py package uses the new wx syntax.
|
|
You can learn more about these in the <a class="reference" href="PyManual.html">PyManual</a>.</p>
|
|
</div>
|
|
</div>
|
|
<hr class="footer"/>
|
|
<div class="footer">
|
|
<a class="reference" href="wxPackage.txt">View document source</a>.
|
|
Generated on: 2003-06-04 18:07 UTC.
|
|
Generated by <a class="reference" href="http://docutils.sourceforge.net/">Docutils</a> from <a class="reference" href="http://docutils.sourceforge.net/rst.html">reStructuredText</a> source.
|
|
</div>
|
|
</body>
|
|
</html>
|