Sophie

Sophie

distrib > Mandriva > 2010.0 > i586 > media > contrib-release > by-pkgid > 6de88b7239d55c600897288d8883c56f > files > 262

python-enthought-codetools-3.1.0-2mdv2010.0.noarch.rpm

<!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">
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    
    <title>TraitslikeContextWrapper &mdash; CodeTools v3.1.0 documentation</title>
    <link rel="stylesheet" href="_static/default.css" type="text/css" />
    <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
    <script type="text/javascript">
      var DOCUMENTATION_OPTIONS = {
        URL_ROOT:    '',
        VERSION:     '3.1.0',
        COLLAPSE_MODINDEX: false,
        FILE_SUFFIX: '.html',
        HAS_SOURCE:  true
      };
    </script>
    <script type="text/javascript" src="_static/jquery.js"></script>
    <script type="text/javascript" src="_static/doctools.js"></script>
    <link rel="shortcut icon" href="_static/et.ico"/>
    <link rel="top" title="CodeTools v3.1.0 documentation" href="index.html" />
    <link rel="up" title="CodeTools Tutorial" href="tutorial.html" />
    <link rel="next" title="MultiContexts" href="tut_multicontext.html" />
    <link rel="prev" title="The Block-Context-Execution Manager Pattern" href="tut_bcem_pattern.html" /> 
  </head>
  <body>
    <div class="related">
      <h3>Navigation</h3>
      <ul>
        <li class="right" style="margin-right: 10px">
          <a href="genindex.html" title="General Index"
             accesskey="I">index</a></li>
        <li class="right" >
          <a href="tut_multicontext.html" title="MultiContexts"
             accesskey="N">next</a> |</li>
        <li class="right" >
          <a href="tut_bcem_pattern.html" title="The Block-Context-Execution Manager Pattern"
             accesskey="P">previous</a> |</li>
        <li><a href="index.html">CodeTools v3.1.0 documentation</a> &raquo;</li>
          <li><a href="tutorial.html" accesskey="U">CodeTools Tutorial</a> &raquo;</li> 
      </ul>
    </div>  

    <div class="document">
      <div class="documentwrapper">
        <div class="bodywrapper">
          <div class="body">
            
  <div class="section" id="traitslikecontextwrapper">
<span id="id1"></span><h1>TraitslikeContextWrapper<a class="headerlink" href="#traitslikecontextwrapper" title="Permalink to this headline">¶</a></h1>
<p>As noted, DataContexts are often put into the role of Model in a MVC UI.
However, the DataContext namespace doesn&#8217;t have Traits information associated
with it, which can be an obstacle to its use in a Traits UI.  For fairly
homogeneous namespaces, or those where it is hard to know what variables
will be present, one approach is to extract and wrap the individual items in
the DataContext namespace and use them directly in the UI (often in a
TableEditor).</p>
<p>However, sometimes we want the DataContext itself to appear like a regular
HasTraits object.  This approach involves listening to the events generated by
the DataContext and using them to keep local copies of the DataContext&#8217;s items
synchronised with it.  This pattern is sufficiently common and useful that the
TraitslikeContextWrapper class is available to simplify this procedure.</p>
<p>To use the TraitslikeContextWrapper, you need to use the <tt class="xref docutils literal"><span class="pre">add_traits()</span></tt>
method to tell it which names in the Context should appear as traits:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="gp">&gt;&gt;&gt; </span><span class="kn">from</span> <span class="nn">enthought.traits.api</span> <span class="kn">import</span> <span class="n">Int</span>
<span class="gp">&gt;&gt;&gt; </span><span class="kn">from</span> <span class="nn">enthought.traits.ui.api</span> <span class="kn">import</span> <span class="n">View</span><span class="p">,</span> <span class="n">Item</span>
<span class="gp">&gt;&gt;&gt; </span><span class="kn">from</span> <span class="nn">enthought.traits.ui.menu</span> <span class="kn">import</span> <span class="n">OKButton</span><span class="p">,</span> <span class="n">CancelButton</span>
<span class="gp">&gt;&gt;&gt; </span><span class="kn">from</span> <span class="nn">enthought.contexts.api</span> <span class="kn">import</span> <span class="n">DataContext</span><span class="p">,</span> <span class="n">TraitslikeContextWrapper</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">d</span> <span class="o">=</span> <span class="n">DataContext</span><span class="p">(</span><span class="n">subcontext</span><span class="o">=</span><span class="p">{</span><span class="s">&#39;a&#39;</span><span class="p">:</span> <span class="mf">1</span><span class="p">,</span> <span class="s">&#39;b&#39;</span><span class="p">:</span> <span class="mf">2</span><span class="p">,</span> <span class="s">&#39;z&#39;</span><span class="p">:</span> <span class="mf">20</span><span class="p">})</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">tcw</span> <span class="o">=</span> <span class="n">TraitslikeContextWrapper</span><span class="p">(</span><span class="n">_context</span><span class="o">=</span><span class="n">d</span><span class="p">)</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">tcw</span><span class="o">.</span><span class="n">add_traits</span><span class="p">(</span><span class="s">&#39;a&#39;</span><span class="p">,</span> <span class="s">&#39;b&#39;</span><span class="p">,</span> <span class="n">c</span><span class="o">=</span><span class="n">Int</span><span class="p">)</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">d</span><span class="o">.</span><span class="n">items</span><span class="p">()</span>
<span class="go">[(&#39;a&#39;, 1), (&#39;c&#39;, 0), (&#39;b&#39;, 2), (&#39;z&#39;, 20)]</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">view</span> <span class="o">=</span> <span class="n">View</span><span class="p">(</span><span class="n">Item</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="s">&#39;a&#39;</span><span class="p">),</span> <span class="n">Item</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="s">&#39;b&#39;</span><span class="p">),</span> <span class="n">Item</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="s">&#39;c&#39;</span><span class="p">),</span>
<span class="gp">... </span>    <span class="n">buttons</span> <span class="o">=</span> <span class="p">[</span><span class="n">OKButton</span><span class="p">,</span> <span class="n">CancelButton</span><span class="p">])</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">tcw</span><span class="o">.</span><span class="n">configure_traits</span><span class="p">(</span><span class="n">view</span><span class="o">=</span><span class="n">view</span><span class="p">)</span>
</pre></div>
</div>
<img alt="_images/tcw_1.png" src="_images/tcw_1.png" />
<p>As can be seen from the window, the TraitslikeContextWrapper makes the wrapped
object act just like a regular HasTraits object.</p>
<p>The example also demonstrates that you can add items into the DataContext
object via the <tt class="xref docutils literal"><span class="pre">add_traits()</span></tt> call, and that you can specify trait types
in the call (i.e., <tt class="docutils literal"><span class="pre">c=Int</span></tt>).</p>
<div class="section" id="example-simple-block-context-application">
<h2>Example: Simple Block Context Application<a class="headerlink" href="#example-simple-block-context-application" title="Permalink to this headline">¶</a></h2>
<p>Putting TraitslikeContextWrapper together with the Block-Context-Execution
Manager pattern, we can easily create simple Traits UI applications around a
code block. The following is a simple but general application that can be found
in the CodeTools examples:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="sd">&quot;&quot;&quot;Simple Block Context Application</span>

<span class="sd">This application demonstrates the use of the Block-Context-Execution Manager</span>
<span class="sd">pattern, together with using a TraitslikeContextWrapper to make items inside a</span>
<span class="sd">data context appear like traits so that they can be used in a TraitsUI app.</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="kn">from</span> <span class="nn">enthought.traits.api</span> <span class="kn">import</span> <span class="n">HasTraits</span><span class="p">,</span> <span class="n">Instance</span><span class="p">,</span> <span class="n">Property</span><span class="p">,</span> <span class="n">Float</span><span class="p">,</span> \
    <span class="n">on_trait_change</span><span class="p">,</span> <span class="n">cached_property</span>
<span class="kn">from</span> <span class="nn">enthought.traits.ui.api</span> <span class="kn">import</span> <span class="n">View</span><span class="p">,</span> <span class="n">Group</span><span class="p">,</span> <span class="n">Item</span>

<span class="kn">from</span> <span class="nn">enthought.contexts.api</span> <span class="kn">import</span> <span class="n">DataContext</span><span class="p">,</span> <span class="n">TraitslikeContextWrapper</span>
<span class="kn">from</span> <span class="nn">enthought.contexts.items_modified_event</span> <span class="kn">import</span> <span class="n">ItemsModified</span>
<span class="kn">from</span> <span class="nn">enthought.blocks.api</span> <span class="kn">import</span> <span class="n">Block</span>

<span class="n">code</span> <span class="o">=</span> <span class="s">&quot;&quot;&quot;# my calculations</span>
<span class="s">velocity = distance/time</span>
<span class="s">momentum = mass*velocity</span>
<span class="s">&quot;&quot;&quot;</span>

<span class="k">class</span> <span class="nc">SimpleBlockContextApp</span><span class="p">(</span><span class="n">HasTraits</span><span class="p">):</span>
    <span class="c"># the data context we are listening to</span>
    <span class="n">data</span> <span class="o">=</span> <span class="n">Instance</span><span class="p">(</span><span class="n">DataContext</span><span class="p">)</span>

    <span class="c"># the block we are executing</span>
    <span class="n">block</span> <span class="o">=</span> <span class="n">Instance</span><span class="p">(</span><span class="n">Block</span><span class="p">)</span>

    <span class="c"># a wrapper around the data to interface with the UI</span>
    <span class="n">tcw</span> <span class="o">=</span> <span class="n">Property</span><span class="p">(</span><span class="n">Instance</span><span class="p">(</span><span class="n">TraitslikeContextWrapper</span><span class="p">),</span> <span class="n">depends_on</span><span class="o">=</span><span class="p">[</span><span class="s">&quot;block&quot;</span><span class="p">,</span> <span class="s">&quot;data&quot;</span><span class="p">])</span>

    <span class="c"># a view for the wrapper</span>
    <span class="n">tcw_view</span> <span class="o">=</span> <span class="n">Property</span><span class="p">(</span><span class="n">Instance</span><span class="p">(</span><span class="n">View</span><span class="p">),</span> <span class="n">depends_on</span><span class="o">=</span><span class="s">&quot;block&quot;</span><span class="p">)</span>

    <span class="nd">@on_trait_change</span><span class="p">(</span><span class="s">&#39;data.items_modified&#39;</span><span class="p">)</span>
    <span class="k">def</span> <span class="nf">data_items_modified</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">event</span><span class="p">):</span>
        <span class="sd">&quot;&quot;&quot;Execute the block if the inputs in the data change&quot;&quot;&quot;</span>
        <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">event</span><span class="p">,</span> <span class="n">ItemsModified</span><span class="p">):</span>
            <span class="n">changed</span> <span class="o">=</span> <span class="n">set</span><span class="p">(</span><span class="n">event</span><span class="o">.</span><span class="n">added</span> <span class="o">+</span> <span class="n">event</span><span class="o">.</span><span class="n">modified</span> <span class="o">+</span> <span class="n">event</span><span class="o">.</span><span class="n">removed</span><span class="p">)</span>
            <span class="n">inputs</span> <span class="o">=</span> <span class="n">changed</span> <span class="o">&amp;</span> <span class="bp">self</span><span class="o">.</span><span class="n">block</span><span class="o">.</span><span class="n">inputs</span>
            <span class="k">if</span> <span class="n">inputs</span><span class="p">:</span>
                <span class="bp">self</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="n">inputs</span><span class="p">)</span>

    <span class="nd">@cached_property</span>
    <span class="k">def</span> <span class="nf">_get_tcw_view</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="sd">&quot;&quot;&quot;Getter for tcw_view: returns View of block inputs and outputs&quot;&quot;&quot;</span>
        <span class="n">inputs</span> <span class="o">=</span> <span class="nb">tuple</span><span class="p">(</span><span class="n">Item</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="nb">input</span><span class="p">)</span>
                       <span class="k">for</span> <span class="nb">input</span> <span class="ow">in</span> <span class="n">sorted</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">block</span><span class="o">.</span><span class="n">inputs</span><span class="p">))</span>
        <span class="n">outputs</span> <span class="o">=</span> <span class="nb">tuple</span><span class="p">(</span><span class="n">Item</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="n">output</span><span class="p">,</span> <span class="n">style</span><span class="o">=</span><span class="s">&quot;readonly&quot;</span><span class="p">)</span>
                        <span class="k">for</span> <span class="n">output</span> <span class="ow">in</span> <span class="n">sorted</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">block</span><span class="o">.</span><span class="n">outputs</span><span class="p">))</span>
        <span class="k">return</span> <span class="n">View</span><span class="p">(</span><span class="n">Group</span><span class="p">(</span><span class="o">*</span><span class="p">(</span><span class="n">inputs</span><span class="o">+</span><span class="n">outputs</span><span class="p">)),</span>
                    <span class="n">kind</span><span class="o">=</span><span class="s">&quot;live&quot;</span><span class="p">)</span>

    <span class="nd">@cached_property</span>
    <span class="k">def</span> <span class="nf">_get_tcw</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="sd">&quot;&quot;&quot;Getter for tcw: returns traits-like wrapper for data context&quot;&quot;&quot;</span>
        <span class="n">in_vars</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">((</span><span class="nb">input</span><span class="p">,</span> <span class="n">Float</span><span class="p">)</span> <span class="k">for</span> <span class="nb">input</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">block</span><span class="o">.</span><span class="n">inputs</span><span class="p">)</span>
        <span class="n">out_vars</span> <span class="o">=</span> <span class="nb">tuple</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">block</span><span class="o">.</span><span class="n">outputs</span><span class="p">)</span>
        <span class="n">tcw</span> <span class="o">=</span> <span class="n">TraitslikeContextWrapper</span><span class="p">(</span><span class="n">_context</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">data</span><span class="p">)</span>
        <span class="n">tcw</span><span class="o">.</span><span class="n">add_traits</span><span class="p">(</span><span class="o">*</span><span class="n">out_vars</span><span class="p">,</span> <span class="o">**</span><span class="n">in_vars</span><span class="p">)</span>
        <span class="k">return</span> <span class="n">tcw</span>

    <span class="k">def</span> <span class="nf">execute</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">inputs</span><span class="p">):</span>
        <span class="sd">&quot;&quot;&quot;Restrict the code block to inputs and execute&quot;&quot;&quot;</span>
        <span class="c"># only execute if we have all inputs</span>
        <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">block</span><span class="o">.</span><span class="n">inputs</span><span class="o">.</span><span class="n">issubset</span><span class="p">(</span><span class="n">set</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">data</span><span class="o">.</span><span class="n">keys</span><span class="p">())):</span>
            <span class="k">try</span><span class="p">:</span>
                <span class="bp">self</span><span class="o">.</span><span class="n">block</span><span class="o">.</span><span class="n">restrict</span><span class="p">(</span><span class="n">inputs</span><span class="o">=</span><span class="n">inputs</span><span class="p">)</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">data</span><span class="p">)</span>
            <span class="k">except</span><span class="p">:</span>
                <span class="c"># ignore exceptions in the block</span>
                <span class="k">pass</span>

<span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="s">&quot;__main__&quot;</span><span class="p">:</span>
    <span class="n">block</span> <span class="o">=</span> <span class="n">Block</span><span class="p">(</span><span class="n">code</span><span class="p">)</span>
    <span class="n">data</span> <span class="o">=</span> <span class="n">DataContext</span><span class="p">(</span><span class="n">subcontext</span><span class="o">=</span><span class="nb">dict</span><span class="p">(</span><span class="n">distance</span><span class="o">=</span><span class="mf">10.0</span><span class="p">,</span> <span class="n">time</span><span class="o">=</span><span class="mf">2.5</span><span class="p">,</span> <span class="n">mass</span><span class="o">=</span><span class="mf">3.0</span><span class="p">))</span>
    <span class="n">execution_manager</span> <span class="o">=</span> <span class="n">SimpleBlockContextApp</span><span class="p">(</span><span class="n">block</span><span class="o">=</span><span class="n">block</span><span class="p">,</span> <span class="n">data</span><span class="o">=</span><span class="n">data</span><span class="p">)</span>
    <span class="n">execution_manager</span><span class="o">.</span><span class="n">tcw</span><span class="o">.</span><span class="n">configure_traits</span><span class="p">(</span><span class="n">view</span><span class="o">=</span><span class="n">execution_manager</span><span class="o">.</span><span class="n">tcw_view</span><span class="p">)</span>
</pre></div>
</div>
<p>The interface looks like this:</p>
<img alt="_images/tcw_2.png" src="_images/tcw_2.png" />
<p>Notice that the SimpleBlockContextApp has no explicit knowledge of the contents
either of the Block or of the DataContext other than expecting floats for the
input variable values. If the code variable were replaced with any other
code block, the code would work just as well.</p>
</div>
</div>


          </div>
        </div>
      </div>
      <div class="sphinxsidebar">
        <div class="sphinxsidebarwrapper">
            <p class="logo"><a href="index.html">
              <img class="logo" src="_static/e-logo-rev.png" alt="Logo"/>
            </a></p>
            <h3><a href="index.html">Table Of Contents</a></h3>
            <ul>
<li><a class="reference external" href="">TraitslikeContextWrapper</a><ul>
<li><a class="reference external" href="#example-simple-block-context-application">Example: Simple Block Context Application</a></li>
</ul>
</li>
</ul>

            <h4>Previous topic</h4>
            <p class="topless"><a href="tut_bcem_pattern.html"
                                  title="previous chapter">The Block-Context-Execution Manager Pattern</a></p>
            <h4>Next topic</h4>
            <p class="topless"><a href="tut_multicontext.html"
                                  title="next chapter">MultiContexts</a></p>
            <h3>This Page</h3>
            <ul class="this-page-menu">
              <li><a href="_sources/tut_tcw.txt"
                     rel="nofollow">Show Source</a></li>
            </ul>
          <div id="searchbox" style="display: none">
            <h3>Quick search</h3>
              <form class="search" action="search.html" method="get">
                <input type="text" name="q" size="18" />
                <input type="submit" value="Go" />
                <input type="hidden" name="check_keywords" value="yes" />
                <input type="hidden" name="area" value="default" />
              </form>
              <p class="searchtip" style="font-size: 90%">
              Enter search terms or a module, class or function name.
              </p>
          </div>
          <script type="text/javascript">$('#searchbox').show(0);</script>
        </div>
      </div>
      <div class="clearer"></div>
    </div>
    <div class="related">
      <h3>Navigation</h3>
      <ul>
        <li class="right" style="margin-right: 10px">
          <a href="genindex.html" title="General Index"
             >index</a></li>
        <li class="right" >
          <a href="tut_multicontext.html" title="MultiContexts"
             >next</a> |</li>
        <li class="right" >
          <a href="tut_bcem_pattern.html" title="The Block-Context-Execution Manager Pattern"
             >previous</a> |</li>
        <li><a href="index.html">CodeTools v3.1.0 documentation</a> &raquo;</li>
          <li><a href="tutorial.html" >CodeTools Tutorial</a> &raquo;</li> 
      </ul>
    </div>
    <div class="footer">
      &copy; Copyright 2008, Enthought.
      Last updated on Aug 21, 2009.
      Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 0.6.2.
    </div>
  </body>
</html>