add tui module and example, add contex manager cd and the method run_file in helper

import vendor modules only once during import

change text color for the method cad_wireframe in geometry_plot_pylab and add hide key
This commit is contained in:
2020-01-13 10:25:33 +01:00
parent 4fc4903dc2
commit 033cb92dc4
28 changed files with 1848 additions and 165 deletions

View File

@@ -50,6 +50,7 @@
<li><a href="pylib/numerical/ode.html">pylib.numerical.ode</a></li>
<li><a href="pylib/numerical/ode_model.html">pylib.numerical.ode_model</a></li>
<li><a href="pylib/time_of_day.html">pylib.time_of_day</a></li>
<li><a href="pylib/tui.html">pylib.tui</a></li>
</ul>
</div>

View File

@@ -180,7 +180,37 @@
<span class="n">plot_post</span><span class="p">(</span><span class="n">ax</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">press</span><span class="p">(</span><span class="n">event</span><span class="p">,</span> <span class="n">world</span><span class="p">,</span> <span class="n">lps</span><span class="p">):</span>
<span class="c1"># &#39;rotate: ←left, right, up, down, ctrl+left, ctrl+right\n&#39; +</span>
<span class="c1"># &#39;pan: shift+left, shift+right, shift+up, shift+down\n&#39; +</span>
<span class="c1"># &#39;zoom: ctrl+up, ctrl+down\n&#39; +</span>
<span class="c1"># &#39;view: f (front), l (left), r (right), t (top), b (bottom)\n&#39; +</span>
<span class="c1"># &#39; i (isometric), d (dimetric)&#39;,</span>
<span class="n">h_open</span> <span class="o">=</span> <span class="n">pylab</span><span class="o">.</span><span class="n">text</span><span class="p">(</span>
<span class="mi">0</span><span class="o">+.</span><span class="mi">01</span><span class="p">,</span> <span class="mi">1</span><span class="o">-.</span><span class="mi">015</span><span class="p">,</span>
<span class="s1">&#39;rotate: [←], [→], [↑], [↓], [Ctrl][←], [Ctrl][→]</span><span class="se">\n</span><span class="s1">&#39;</span> <span class="o">+</span>
<span class="s1">&#39;pan: [Shift][←], [Shift][→], [Shift][↑], [Shift][↓]</span><span class="se">\n</span><span class="s1">&#39;</span> <span class="o">+</span>
<span class="s1">&#39;zoom: [Ctrl][↑], [Ctrl][↓]</span><span class="se">\n</span><span class="s1">&#39;</span> <span class="o">+</span>
<span class="s1">&#39;view: [f]ront, [l]eft, [r]ight, [t]op, [b]ottom</span><span class="se">\n</span><span class="s1">&#39;</span> <span class="o">+</span>
<span class="s1">&#39; [i]sometric, [d]imetric&#39;</span><span class="p">,</span>
<span class="n">color</span><span class="o">=</span><span class="s1">&#39;#2280c0&#39;</span><span class="p">,</span>
<span class="n">horizontalalignment</span><span class="o">=</span><span class="s1">&#39;left&#39;</span><span class="p">,</span>
<span class="n">verticalalignment</span><span class="o">=</span><span class="s1">&#39;top&#39;</span><span class="p">,</span>
<span class="n">transform</span><span class="o">=</span><span class="n">fig</span><span class="o">.</span><span class="n">transFigure</span><span class="p">,</span>
<span class="n">bbox</span><span class="o">=</span><span class="nb">dict</span><span class="p">(</span><span class="n">facecolor</span><span class="o">=</span><span class="s1">&#39;black&#39;</span><span class="p">,</span> <span class="n">edgecolor</span><span class="o">=</span><span class="s1">&#39;#196090&#39;</span><span class="p">,</span> <span class="n">alpha</span><span class="o">=</span><span class="mf">0.5</span><span class="p">),</span>
<span class="n">family</span><span class="o">=</span><span class="s1">&#39;monospace&#39;</span>
<span class="p">)</span>
<span class="n">h_close</span> <span class="o">=</span> <span class="n">pylab</span><span class="o">.</span><span class="n">text</span><span class="p">(</span>
<span class="mi">0</span><span class="o">+.</span><span class="mi">01</span><span class="p">,</span> <span class="mi">1</span><span class="o">-.</span><span class="mi">015</span><span class="p">,</span> <span class="s1">&#39;[h]elp&#39;</span><span class="p">,</span>
<span class="n">color</span><span class="o">=</span><span class="s1">&#39;#2280c0&#39;</span><span class="p">,</span>
<span class="n">horizontalalignment</span><span class="o">=</span><span class="s1">&#39;left&#39;</span><span class="p">,</span>
<span class="n">verticalalignment</span><span class="o">=</span><span class="s1">&#39;top&#39;</span><span class="p">,</span>
<span class="n">transform</span><span class="o">=</span><span class="n">fig</span><span class="o">.</span><span class="n">transFigure</span><span class="p">,</span>
<span class="n">bbox</span><span class="o">=</span><span class="nb">dict</span><span class="p">(</span><span class="n">facecolor</span><span class="o">=</span><span class="s1">&#39;black&#39;</span><span class="p">,</span> <span class="n">edgecolor</span><span class="o">=</span><span class="s1">&#39;#196090&#39;</span><span class="p">,</span> <span class="n">alpha</span><span class="o">=</span><span class="mf">0.5</span><span class="p">),</span>
<span class="n">family</span><span class="o">=</span><span class="s1">&#39;monospace&#39;</span><span class="p">,</span>
<span class="n">visible</span><span class="o">=</span><span class="kc">False</span>
<span class="p">)</span>
<span class="k">def</span> <span class="nf">press</span><span class="p">(</span><span class="n">event</span><span class="p">,</span> <span class="n">world</span><span class="p">,</span> <span class="n">lps</span><span class="p">,</span> <span class="n">h_open</span><span class="p">,</span> <span class="n">h_close</span><span class="p">):</span>
<span class="c1">#print(&#39;key pressed:&#39;, event.key)</span>
<span class="c1">#sys.stdout.flush()</span>
<span class="k">if</span> <span class="n">event</span><span class="o">.</span><span class="n">key</span> <span class="ow">in</span> <span class="p">[</span>
@@ -250,6 +280,10 @@
<span class="n">world</span><span class="o">.</span><span class="n">scale</span><span class="p">(</span><span class="mf">0.9</span><span class="p">)</span>
<span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">j</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="n">lps</span><span class="p">,</span> <span class="n">world</span><span class="o">.</span><span class="n">wireframes_xy</span><span class="p">()):</span>
<span class="n">i</span><span class="o">.</span><span class="n">set_data</span><span class="p">(</span><span class="n">j</span><span class="p">)</span>
<span class="k">if</span> <span class="n">event</span><span class="o">.</span><span class="n">key</span> <span class="o">==</span> <span class="s1">&#39;h&#39;</span><span class="p">:</span>
<span class="n">visible</span> <span class="o">=</span> <span class="n">h_open</span><span class="o">.</span><span class="n">get_visible</span><span class="p">()</span>
<span class="n">h_open</span><span class="o">.</span><span class="n">set_visible</span><span class="p">(</span><span class="ow">not</span> <span class="n">visible</span><span class="p">)</span>
<span class="n">h_close</span><span class="o">.</span><span class="n">set_visible</span><span class="p">(</span><span class="n">visible</span><span class="p">)</span>
<span class="n">fig</span><span class="o">.</span><span class="n">canvas</span><span class="o">.</span><span class="n">draw</span><span class="p">()</span>
<span class="k">def</span> <span class="nf">onresize</span><span class="p">(</span><span class="n">event</span><span class="p">,</span> <span class="n">w</span><span class="p">):</span>
@@ -258,28 +292,10 @@
<span class="n">pylab</span><span class="o">.</span><span class="n">ylim</span><span class="p">((</span><span class="o">-</span><span class="n">r</span><span class="p">,</span> <span class="n">r</span><span class="p">))</span>
<span class="n">fig</span><span class="o">.</span><span class="n">canvas</span><span class="o">.</span><span class="n">mpl_connect</span><span class="p">(</span><span class="s1">&#39;key_press_event&#39;</span><span class="p">,</span>
<span class="k">lambda</span> <span class="n">event</span><span class="p">:</span> <span class="n">press</span><span class="p">(</span><span class="n">event</span><span class="p">,</span> <span class="n">world</span><span class="p">,</span> <span class="n">lps</span><span class="p">))</span>
<span class="k">lambda</span> <span class="n">event</span><span class="p">:</span> <span class="n">press</span><span class="p">(</span><span class="n">event</span><span class="p">,</span> <span class="n">world</span><span class="p">,</span> <span class="n">lps</span><span class="p">,</span>
<span class="n">h_open</span><span class="p">,</span> <span class="n">h_close</span><span class="p">))</span>
<span class="n">fig</span><span class="o">.</span><span class="n">canvas</span><span class="o">.</span><span class="n">mpl_connect</span><span class="p">(</span><span class="s1">&#39;resize_event&#39;</span><span class="p">,</span>
<span class="k">lambda</span> <span class="n">event</span><span class="p">:</span> <span class="n">onresize</span><span class="p">(</span><span class="n">event</span><span class="p">,</span> <span class="n">world</span><span class="p">))</span>
<span class="c1"># &#39;rotate: ←left, right, up, down, ctrl+left, ctrl+right\n&#39; +</span>
<span class="c1"># &#39;pan: shift+left, shift+right, shift+up, shift+down\n&#39; +</span>
<span class="c1"># &#39;zoom: ctrl+up, ctrl+down\n&#39; +</span>
<span class="c1"># &#39;view: f (front), l (left), r (right), t (top), b (bottom)\n&#39; +</span>
<span class="c1"># &#39; i (isometric), d (dimetric)&#39;,</span>
<span class="n">pylab</span><span class="o">.</span><span class="n">text</span><span class="p">(</span>
<span class="mi">0</span><span class="o">+.</span><span class="mi">01</span><span class="p">,</span> <span class="mi">1</span><span class="o">-.</span><span class="mi">015</span><span class="p">,</span>
<span class="s1">&#39;rotate: [←], [→], [↑], [↓], [Ctrl][←], [Ctrl][→]</span><span class="se">\n</span><span class="s1">&#39;</span> <span class="o">+</span>
<span class="s1">&#39;pan: [Shift][←], [Shift][→], [Shift][↑], [Shift][↓]</span><span class="se">\n</span><span class="s1">&#39;</span> <span class="o">+</span>
<span class="s1">&#39;zoom: [Ctrl][↑], [Ctrl][↓]</span><span class="se">\n</span><span class="s1">&#39;</span> <span class="o">+</span>
<span class="s1">&#39;view: [f]ront, [l]eft, [r]ight, [t]op, [b]ottom</span><span class="se">\n</span><span class="s1">&#39;</span> <span class="o">+</span>
<span class="s1">&#39; [i]sometric, [d]imetric&#39;</span><span class="p">,</span>
<span class="n">horizontalalignment</span><span class="o">=</span><span class="s1">&#39;left&#39;</span><span class="p">,</span>
<span class="n">verticalalignment</span><span class="o">=</span><span class="s1">&#39;top&#39;</span><span class="p">,</span>
<span class="n">transform</span><span class="o">=</span><span class="n">fig</span><span class="o">.</span><span class="n">transFigure</span><span class="p">,</span>
<span class="n">bbox</span><span class="o">=</span><span class="nb">dict</span><span class="p">(</span><span class="n">facecolor</span><span class="o">=</span><span class="s1">&#39;black&#39;</span><span class="p">,</span> <span class="n">alpha</span><span class="o">=</span><span class="mf">0.5</span><span class="p">),</span>
<span class="n">family</span><span class="o">=</span><span class="s1">&#39;monospace&#39;</span>
<span class="p">)</span>
<span class="n">pylab</span><span class="o">.</span><span class="n">show</span><span class="p">()</span></div>
</pre></div>

View File

@@ -45,6 +45,7 @@
<span class="sd">.. moduleauthor:: Daniel Weschke &lt;daniel.weschke@directbox.de&gt;</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="kn">import</span> <span class="nn">os</span>
<span class="kn">import</span> <span class="nn">time</span>
<span class="kn">from</span> <span class="nn">contextlib</span> <span class="kn">import</span> <span class="n">ContextDecorator</span>
@@ -81,6 +82,46 @@
<span class="n">elapsed_time_ms</span> <span class="o">=</span> <span class="p">(</span><span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span> <span class="o">-</span> <span class="bp">self</span><span class="o">.</span><span class="n">start_time</span><span class="p">)</span> <span class="o">*</span> <span class="mi">1000</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">&#39;</span><span class="si">{:s}</span><span class="s1"> took </span><span class="si">{:.3f}</span><span class="s1"> ms&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">description</span><span class="p">,</span> <span class="n">elapsed_time_ms</span><span class="p">))</span>
<span class="k">return</span> <span class="kc">False</span></div>
<div class="viewcode-block" id="cd"><a class="viewcode-back" href="../../pylib.helper.html#pylib.helper.cd">[docs]</a><span class="k">class</span> <span class="nc">cd</span><span class="p">:</span>
<span class="sd">&quot;&quot;&quot;Context manager for changing the current working directory</span>
<span class="sd"> :param new_path: the directory to change into</span>
<span class="sd"> :type new_path: string</span>
<span class="sd"> :Example:</span>
<span class="sd"> ::</span>
<span class="sd"> # enter the directory and run some code:</span>
<span class="sd"> with cd(&quot;~/tmp&quot;):</span>
<span class="sd"> # we are now in ~/tmp</span>
<span class="sd"> # code</span>
<span class="sd"> # outside the context manager we are back where we started.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">new_path</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">new_path</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">expanduser</span><span class="p">(</span><span class="n">new_path</span><span class="p">)</span>
<span class="k">def</span> <span class="fm">__enter__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">saved_path</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">getcwd</span><span class="p">()</span>
<span class="n">os</span><span class="o">.</span><span class="n">chdir</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">new_path</span><span class="p">)</span>
<span class="k">def</span> <span class="fm">__exit__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">etype</span><span class="p">,</span> <span class="n">value</span><span class="p">,</span> <span class="n">traceback</span><span class="p">):</span>
<span class="n">os</span><span class="o">.</span><span class="n">chdir</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">saved_path</span><span class="p">)</span></div>
<div class="viewcode-block" id="run_file"><a class="viewcode-back" href="../../pylib.helper.html#pylib.helper.run_file">[docs]</a><span class="k">def</span> <span class="nf">run_file</span><span class="p">(</span><span class="n">file_name</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Run a file.</span>
<span class="sd"> Inside a pythin interpreter it changes to the directory of the</span>
<span class="sd"> file and after excuting the file it changes back to the working</span>
<span class="sd"> directory before.</span>
<span class="sd"> :param file_name: the file to execute</span>
<span class="sd"> :type file_name: string</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">workdir</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">dirname</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">abspath</span><span class="p">(</span><span class="n">file_name</span><span class="p">))</span>
<span class="k">with</span> <span class="n">cd</span><span class="p">(</span><span class="n">workdir</span><span class="p">):</span>
<span class="n">exec</span><span class="p">(</span><span class="nb">open</span><span class="p">(</span><span class="n">file_name</span><span class="p">)</span><span class="o">.</span><span class="n">read</span><span class="p">())</span></div>
</pre></div>
</div>

View File

@@ -668,7 +668,7 @@
<span class="sd"> &quot;&quot;&quot;</span>
<div class="viewcode-block" id="matrix.__getitem__"><a class="viewcode-back" href="../../pylib.mathematics.html#pylib.mathematics.matrix.__getitem__">[docs]</a> <span class="k">def</span> <span class="fm">__getitem__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">index</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sa">r</span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> For index return value, for range return new vector object.</span>
<span class="sd"> :Example:</span>
@@ -825,7 +825,7 @@
<span class="sd"> :Example:</span>
<span class="sd"> &gt;&gt;&gt; m = matrix.zeros(3, 3)</span>
<span class="sd"> &gt;&gt;&gt; print(m)\</span>
<span class="sd"> &gt;&gt;&gt; print(m)</span>
<span class="sd"> [[0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0]]</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="n">matrix</span><span class="p">([[</span><span class="mf">0.</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">n</span><span class="p">)]</span> <span class="k">for</span> <span class="n">j</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">m</span><span class="p">)])</span></div>

463
docs/build/html/_modules/pylib/tui.html vendored Normal file
View File

@@ -0,0 +1,463 @@
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta charset="utf-8" />
<title>pylib.tui &#8212; pylib 2019.12.21 documentation</title>
<link rel="stylesheet" href="../../_static/alabaster.css" type="text/css" />
<link rel="stylesheet" href="../../_static/pygments.css" type="text/css" />
<link rel="stylesheet" href="../../_static/custom.css" type="text/css" />
<script type="text/javascript" id="documentation_options" data-url_root="../../" src="../../_static/documentation_options.js"></script>
<script type="text/javascript" src="../../_static/jquery.js"></script>
<script type="text/javascript" src="../../_static/underscore.js"></script>
<script type="text/javascript" src="../../_static/doctools.js"></script>
<script type="text/javascript" src="../../_static/language_data.js"></script>
<script async="async" type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/latest.js?config=TeX-AMS-MML_HTMLorMML"></script>
<link rel="index" title="Index" href="../../genindex.html" />
<link rel="search" title="Search" href="../../search.html" />
<link rel="stylesheet" href="../../_static/custom.css" type="text/css" />
<meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9" />
</head><body>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<div class="body" role="main">
<h1>Source code for pylib.tui</h1><div class="highlight"><pre>
<span></span><span class="ch">#!/usr/bin/env python</span>
<span class="c1"># -*- coding: utf-8 -*-</span>
<span class="sd">&quot;&quot;&quot;TUI module.</span>
<span class="sd">:Date: 2020-01-10</span>
<span class="sd">.. module:: tui</span>
<span class="sd"> :platform: *nix, Windows</span>
<span class="sd"> :synopsis: TUI module.</span>
<span class="sd">.. moduleauthor:: Daniel Weschke &lt;daniel.weschke@directbox.de&gt;</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="c1"># TODO: two classes to distinguish between curses (main tui) and</span>
<span class="c1"># window (to handle sub windows)?</span>
<span class="c1"># TODO: width resizing, min width now 6 because of text and border</span>
<span class="c1"># TODO: height resizing, min height</span>
<span class="kn">import</span> <span class="nn">sys</span>
<span class="kn">import</span> <span class="nn">curses</span>
<div class="viewcode-block" id="newwin"><a class="viewcode-back" href="../../pylib.tui.html#pylib.tui.newwin">[docs]</a><span class="k">def</span> <span class="nf">newwin</span><span class="p">(</span><span class="n">height</span><span class="p">,</span> <span class="n">width</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">x</span><span class="p">):</span>
<span class="n">win</span> <span class="o">=</span> <span class="n">Window</span><span class="p">()</span>
<span class="n">win</span><span class="o">.</span><span class="n">window</span> <span class="o">=</span> <span class="n">curses</span><span class="o">.</span><span class="n">newwin</span><span class="p">(</span><span class="n">height</span><span class="p">,</span> <span class="n">width</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">x</span><span class="p">)</span>
<span class="k">return</span> <span class="n">win</span></div>
<div class="viewcode-block" id="StdOutWrapper"><a class="viewcode-back" href="../../pylib.tui.html#pylib.tui.StdOutWrapper">[docs]</a><span class="k">class</span> <span class="nc">StdOutWrapper</span><span class="p">:</span>
<span class="sd">&quot;&quot;&quot;Send print to stdout (print to the standard console).</span>
<span class="sd"> usage:</span>
<span class="sd"> ::</span>
<span class="sd"> # catch all prints into StdOutWrapper</span>
<span class="sd"> mystdout = StdOutWrapper()</span>
<span class="sd"> sys.stdout = mystdout</span>
<span class="sd"> sys.stderr = mystdout</span>
<span class="sd"> # begin curses (curses.initscr())</span>
<span class="sd"> # do your stuff here</span>
<span class="sd"> # print(&quot;foo&quot;)</span>
<span class="sd"> # you can also output mystdout.get_text() in a ncurses widget in</span>
<span class="sd"> # runtime</span>
<span class="sd"> # end curses (curses.endwin())</span>
<span class="sd"> # go back to normal state and print all catched prints to stdout</span>
<span class="sd"> sys.stdout = sys.__stdout__</span>
<span class="sd"> sys.stderr = sys.__stderr__</span>
<span class="sd"> sys.stdout.write(mystdout.get_text())</span>
<span class="sd"> source:</span>
<span class="sd"> https://stackoverflow.com/a/14010948</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">text</span> <span class="o">=</span> <span class="s2">&quot;&quot;</span>
<div class="viewcode-block" id="StdOutWrapper.write"><a class="viewcode-back" href="../../pylib.tui.html#pylib.tui.StdOutWrapper.write">[docs]</a> <span class="k">def</span> <span class="nf">write</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">txt</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">text</span> <span class="o">+=</span> <span class="n">txt</span>
<span class="bp">self</span><span class="o">.</span><span class="n">text</span> <span class="o">=</span> <span class="s1">&#39;</span><span class="se">\n</span><span class="s1">&#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">text</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">&#39;</span><span class="se">\n</span><span class="s1">&#39;</span><span class="p">)[</span><span class="o">-</span><span class="mi">30</span><span class="p">:])</span></div>
<div class="viewcode-block" id="StdOutWrapper.get_text"><a class="viewcode-back" href="../../pylib.tui.html#pylib.tui.StdOutWrapper.get_text">[docs]</a> <span class="k">def</span> <span class="nf">get_text</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="s1">&#39;</span><span class="se">\n</span><span class="s1">&#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">text</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">&#39;</span><span class="se">\n</span><span class="s1">&#39;</span><span class="p">))</span></div></div>
<span class="c1">#def get_text(self,beg,end):</span>
<span class="c1"># return &#39;\n&#39;.join(self.text.split(&#39;\n&#39;)[beg:end])</span>
<div class="viewcode-block" id="TUI"><a class="viewcode-back" href="../../pylib.tui.html#pylib.tui.TUI">[docs]</a><span class="k">class</span> <span class="nc">TUI</span><span class="p">:</span>
<span class="sd">&quot;&quot;&quot;TUI text-based user interface</span>
<span class="sd"> initscr is the encapsulation window object of the stdscr</span>
<span class="sd"> stdsc is the curses.initscr</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">delay</span><span class="o">=</span><span class="mi">5</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> :param delay: sets the curses.halfdelay, value between 1 and 255.</span>
<span class="sd"> :param type: int</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">delay</span><span class="p">,</span> <span class="nb">int</span><span class="p">):</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">delay</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">delay</span><span class="p">)</span>
<span class="k">except</span> <span class="ne">ValueError</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;TUI(delay)&quot;</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Could not convert the argument to an integer.&quot;</span><span class="p">)</span>
<span class="c1"># catch all prints into StdOutWrapper</span>
<span class="bp">self</span><span class="o">.</span><span class="n">stdout</span> <span class="o">=</span> <span class="n">StdOutWrapper</span><span class="p">()</span>
<span class="n">sys</span><span class="o">.</span><span class="n">stdout</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">stdout</span>
<span class="n">sys</span><span class="o">.</span><span class="n">stderr</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">stdout</span>
<span class="c1"># Define the appearance of some interface elements</span>
<span class="n">hotkey_attr</span> <span class="o">=</span> <span class="n">curses</span><span class="o">.</span><span class="n">A_BOLD</span> <span class="o">|</span> <span class="n">curses</span><span class="o">.</span><span class="n">A_UNDERLINE</span>
<span class="n">menu_attr</span> <span class="o">=</span> <span class="n">curses</span><span class="o">.</span><span class="n">A_NORMAL</span>
<span class="bp">self</span><span class="o">.</span><span class="n">initscr</span> <span class="o">=</span> <span class="n">Window</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">initscr</span><span class="o">.</span><span class="n">initscr</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">stdscr</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">initscr</span><span class="o">.</span><span class="n">window</span>
<span class="c1">#print(type(self.stdscr))</span>
<span class="c1">#print(type(self.initscr))</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">curses</span><span class="o">.</span><span class="n">cbreak</span><span class="p">()</span>
<span class="n">curses</span><span class="o">.</span><span class="n">halfdelay</span><span class="p">(</span><span class="n">delay</span><span class="p">)</span> <span class="c1"># How many tenths of a second are waited, from 1 to 255</span>
<span class="c1">#stdscr.nodelay(1)</span>
<span class="n">curses</span><span class="o">.</span><span class="n">noecho</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">cursor_visibility</span> <span class="o">=</span> <span class="mi">0</span> <span class="c1"># Set the cursor state. visibility can be set to 0, 1, or 2, for invisible, normal, or very visible.</span>
<span class="n">curses</span><span class="o">.</span><span class="n">curs_set</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">cursor_visibility</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">stdscr</span><span class="o">.</span><span class="n">keypad</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
<span class="n">curses</span><span class="o">.</span><span class="n">mousemask</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span> <span class="c1"># activate mouse events</span>
<span class="c1"># init colors</span>
<span class="k">if</span> <span class="n">curses</span><span class="o">.</span><span class="n">has_colors</span><span class="p">():</span>
<span class="n">curses</span><span class="o">.</span><span class="n">start_color</span><span class="p">()</span> <span class="c1"># initializes 8 basic colors. 0:black, 1:red, 2:green, 3:yellow, 4:blue, 5:magenta, 6:cyan, and 7:white.</span>
<span class="n">curses</span><span class="o">.</span><span class="n">use_default_colors</span><span class="p">()</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">curses</span><span class="o">.</span><span class="n">COLORS</span><span class="p">):</span>
<span class="n">curses</span><span class="o">.</span><span class="n">init_pair</span><span class="p">(</span><span class="n">i</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span> <span class="n">i</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">)</span> <span class="c1"># Color pair 0 is hard-wired to white on black, and cannot be changed.</span>
<span class="k">except</span><span class="p">:</span> <span class="k">pass</span>
<span class="bp">self</span><span class="o">.</span><span class="n">last_pressed_ch</span> <span class="o">=</span> <span class="mi">0</span> <span class="c1"># getch() Note that the integer returned does not have to be in ASCII range: function keys, keypad keys and so on return numbers higher than 256.</span>
<span class="bp">self</span><span class="o">.</span><span class="n">last_pressed_mouse_ch</span> <span class="o">=</span> <span class="mi">0</span>
<div class="viewcode-block" id="TUI.refresh"><a class="viewcode-back" href="../../pylib.tui.html#pylib.tui.TUI.refresh">[docs]</a> <span class="k">def</span> <span class="nf">refresh</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">initscr</span><span class="o">.</span><span class="n">refresh</span><span class="p">()</span> <span class="c1"># update the screen</span></div>
<div class="viewcode-block" id="TUI.getch"><a class="viewcode-back" href="../../pylib.tui.html#pylib.tui.TUI.getch">[docs]</a> <span class="k">def</span> <span class="nf">getch</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="c1"># keep last key value</span>
<span class="n">last_pressed_ch_current</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">initscr</span><span class="o">.</span><span class="n">getch</span><span class="p">()</span>
<span class="k">if</span> <span class="n">last_pressed_ch_current</span> <span class="o">!=</span> <span class="n">curses</span><span class="o">.</span><span class="n">ERR</span><span class="p">:</span>
<span class="c1"># keep last key while window resizing</span>
<span class="k">if</span> <span class="n">last_pressed_ch_current</span> <span class="o">==</span> <span class="n">curses</span><span class="o">.</span><span class="n">KEY_MOUSE</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">last_pressed_mouse_ch</span> <span class="o">=</span> <span class="n">last_pressed_ch_current</span>
<span class="k">if</span> <span class="n">last_pressed_ch_current</span> <span class="ow">in</span> <span class="p">[</span><span class="n">curses</span><span class="o">.</span><span class="n">KEY_MOUSE</span><span class="p">,</span> <span class="n">curses</span><span class="o">.</span><span class="n">KEY_RESIZE</span><span class="p">]:</span>
<span class="k">pass</span>
<span class="k">else</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">last_pressed_ch</span> <span class="o">=</span> <span class="n">last_pressed_ch_current</span></div>
<div class="viewcode-block" id="TUI.color_table"><a class="viewcode-back" href="../../pylib.tui.html#pylib.tui.TUI.color_table">[docs]</a> <span class="k">def</span> <span class="nf">color_table</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">window</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Print all available colors with default background.</span>
<span class="sd"> Check if curses.has_colors() is True.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="c1"># TODO: position</span>
<span class="c1"># FIXME: use own text method?</span>
<span class="c1"># FIXME: build full str first and then print?</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">curses</span><span class="o">.</span><span class="n">has_colors</span><span class="p">():</span>
<span class="k">return</span>
<span class="k">if</span> <span class="n">window</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">window</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">stdscr</span>
<span class="n">window</span><span class="o">.</span><span class="n">addstr</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="s1">&#39;</span><span class="si">{0}</span><span class="s1"> colors available&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">curses</span><span class="o">.</span><span class="n">COLORS</span><span class="p">))</span>
<span class="k">if</span> <span class="n">curses</span><span class="o">.</span><span class="n">can_change_color</span><span class="p">():</span>
<span class="n">window</span><span class="o">.</span><span class="n">addstr</span><span class="p">(</span><span class="s1">&#39; (can change color: </span><span class="si">{0}</span><span class="s1">)&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">curses</span><span class="o">.</span><span class="n">can_change_color</span><span class="p">()))</span>
<span class="n">_</span><span class="p">,</span> <span class="n">maxx</span> <span class="o">=</span> <span class="n">window</span><span class="o">.</span><span class="n">getmaxyx</span><span class="p">()</span>
<span class="n">step_size</span> <span class="o">=</span> <span class="mi">4</span>
<span class="n">maxx</span> <span class="o">=</span> <span class="n">maxx</span> <span class="o">-</span> <span class="n">maxx</span> <span class="o">%</span> <span class="n">step_size</span>
<span class="n">x</span> <span class="o">=</span> <span class="mi">0</span>
<span class="n">y</span> <span class="o">=</span> <span class="mi">3</span>
<span class="k">try</span><span class="p">:</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">curses</span><span class="o">.</span><span class="n">COLORS</span><span class="p">):</span>
<span class="n">window</span><span class="o">.</span><span class="n">addstr</span><span class="p">(</span><span class="n">y</span><span class="p">,</span> <span class="n">x</span><span class="p">,</span> <span class="s1">&#39;{0:</span><span class="si">{1}</span><span class="s1">}&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">i</span><span class="p">,</span> <span class="n">step_size</span><span class="p">),</span> <span class="n">curses</span><span class="o">.</span><span class="n">color_pair</span><span class="p">(</span><span class="n">i</span><span class="p">))</span>
<span class="n">x</span> <span class="o">=</span> <span class="p">(</span><span class="n">x</span> <span class="o">+</span> <span class="n">step_size</span><span class="p">)</span> <span class="o">%</span> <span class="n">maxx</span>
<span class="k">if</span> <span class="n">x</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
<span class="n">y</span> <span class="o">+=</span> <span class="mi">1</span>
<span class="k">except</span><span class="p">:</span>
<span class="c1"># End of screen reached</span>
<span class="k">pass</span></div>
<div class="viewcode-block" id="TUI.color_def"><a class="viewcode-back" href="../../pylib.tui.html#pylib.tui.TUI.color_def">[docs]</a> <span class="k">def</span> <span class="nf">color_def</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">if</span> <span class="n">curses</span><span class="o">.</span><span class="n">can_change_color</span><span class="p">():</span> <span class="c1"># if True curses.init_color(color_number, r, g, b) can be used</span>
<span class="k">pass</span></div>
<span class="c1"># changes colors for the terminal also after closing the program.</span>
<span class="c1">#curses.color_content(0)</span>
<span class="c1">#tmp = curses.color_content(1)</span>
<span class="c1">#print(curses.color_content(1))</span>
<span class="c1">#curses.init_color(0, 1000, 0, 0) # color_number = init_pair number - 1 (maybe because init_pair number 0 is hard-wired and not changeable)</span>
<span class="c1">#curses.init_color(1, 1000, 500, 1000)</span>
<span class="c1">#print(curses.color_content(1))</span>
<span class="c1">#curses.init_color(1, *tmp)</span>
<span class="c1">#print(curses.color_content(1))</span>
<div class="viewcode-block" id="TUI.clear"><a class="viewcode-back" href="../../pylib.tui.html#pylib.tui.TUI.clear">[docs]</a> <span class="k">def</span> <span class="nf">clear</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">stdscr</span><span class="o">.</span><span class="n">clear</span><span class="p">()</span></div>
<div class="viewcode-block" id="TUI.end"><a class="viewcode-back" href="../../pylib.tui.html#pylib.tui.TUI.end">[docs]</a> <span class="k">def</span> <span class="nf">end</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;clean up&quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">stdscr</span><span class="o">.</span><span class="n">clear</span><span class="p">()</span>
<span class="n">curses</span><span class="o">.</span><span class="n">nocbreak</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">stdscr</span><span class="o">.</span><span class="n">keypad</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>
<span class="n">curses</span><span class="o">.</span><span class="n">echo</span><span class="p">()</span>
<span class="n">curses</span><span class="o">.</span><span class="n">endwin</span><span class="p">()</span>
<span class="c1"># go back to normal state and print all catched prints to stdout</span>
<span class="n">sys</span><span class="o">.</span><span class="n">stdout</span> <span class="o">=</span> <span class="n">sys</span><span class="o">.</span><span class="n">__stdout__</span>
<span class="n">sys</span><span class="o">.</span><span class="n">stderr</span> <span class="o">=</span> <span class="n">sys</span><span class="o">.</span><span class="n">__stderr__</span>
<span class="n">sys</span><span class="o">.</span><span class="n">stdout</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">stdout</span><span class="o">.</span><span class="n">get_text</span><span class="p">())</span></div></div>
<div class="viewcode-block" id="Window"><a class="viewcode-back" href="../../pylib.tui.html#pylib.tui.Window">[docs]</a><span class="k">class</span> <span class="nc">Window</span><span class="p">:</span>
<span class="sd">&quot;&quot;&quot;Window</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">window</span> <span class="o">=</span> <span class="kc">None</span>
<div class="viewcode-block" id="Window.initscr"><a class="viewcode-back" href="../../pylib.tui.html#pylib.tui.Window.initscr">[docs]</a> <span class="k">def</span> <span class="nf">initscr</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">window</span> <span class="o">=</span> <span class="n">curses</span><span class="o">.</span><span class="n">initscr</span><span class="p">()</span></div>
<div class="viewcode-block" id="Window.derwin"><a class="viewcode-back" href="../../pylib.tui.html#pylib.tui.Window.derwin">[docs]</a> <span class="k">def</span> <span class="nf">derwin</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">height</span><span class="p">,</span> <span class="n">width</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">x</span><span class="p">):</span>
<span class="n">win</span> <span class="o">=</span> <span class="n">Window</span><span class="p">()</span>
<span class="n">win</span><span class="o">.</span><span class="n">window</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">window</span><span class="o">.</span><span class="n">derwin</span><span class="p">(</span><span class="n">height</span><span class="p">,</span> <span class="n">width</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">x</span><span class="p">)</span>
<span class="k">return</span> <span class="n">win</span></div>
<div class="viewcode-block" id="Window.clear"><a class="viewcode-back" href="../../pylib.tui.html#pylib.tui.Window.clear">[docs]</a> <span class="k">def</span> <span class="nf">clear</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">window</span><span class="o">.</span><span class="n">clear</span><span class="p">()</span></div>
<div class="viewcode-block" id="Window.getmaxyx"><a class="viewcode-back" href="../../pylib.tui.html#pylib.tui.Window.getmaxyx">[docs]</a> <span class="k">def</span> <span class="nf">getmaxyx</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">window</span><span class="o">.</span><span class="n">getmaxyx</span><span class="p">()</span></div>
<div class="viewcode-block" id="Window.getch"><a class="viewcode-back" href="../../pylib.tui.html#pylib.tui.Window.getch">[docs]</a> <span class="k">def</span> <span class="nf">getch</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">window</span><span class="o">.</span><span class="n">getch</span><span class="p">()</span></div>
<div class="viewcode-block" id="Window.instr"><a class="viewcode-back" href="../../pylib.tui.html#pylib.tui.Window.instr">[docs]</a> <span class="k">def</span> <span class="nf">instr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">x</span><span class="p">,</span> <span class="n">n</span><span class="p">):</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">window</span><span class="o">.</span><span class="n">instr</span><span class="p">(</span><span class="n">y</span><span class="p">,</span> <span class="n">x</span><span class="p">,</span> <span class="n">n</span><span class="p">)</span><span class="o">.</span><span class="n">decode</span><span class="p">()</span></div>
<div class="viewcode-block" id="Window.text"><a class="viewcode-back" href="../../pylib.tui.html#pylib.tui.Window.text">[docs]</a> <span class="k">def</span> <span class="nf">text</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">string</span><span class="p">,</span> <span class="n">padding_left</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">padding_top</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">attribute</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">color_pair</span><span class="o">=</span><span class="mi">0</span><span class="p">):</span>
<span class="sa">r</span><span class="sd">&quot;&quot;&quot;Test to screen. If multiline than keep the x position for</span>
<span class="sd"> each new line.</span>
<span class="sd"> :Example:</span>
<span class="sd"> ::</span>
<span class="sd"> text(stdscr, 2, 1, &quot;1 - Show test page&quot;)</span>
<span class="sd"> text(stdscr, 3, 1, &quot;h - Show help page&quot;)</span>
<span class="sd"> text(stdscr, 4, 1, &quot;q - Exit&quot;)</span>
<span class="sd"> text(stdscr, 2, 1,</span>
<span class="sd"> &quot;1 - Show test page\\n&quot; +</span>
<span class="sd"> &quot;h - Show help page\\n&quot; +</span>
<span class="sd"> &quot;q - Exit&quot;)</span>
<span class="sd"> .. note::</span>
<span class="sd"> Writing in the last char of the window (last row bottom and</span>
<span class="sd"> last column right) is suppressed</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">win_height</span><span class="p">,</span> <span class="n">win_width</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">window</span><span class="o">.</span><span class="n">getmaxyx</span><span class="p">()</span>
<span class="k">if</span> <span class="n">win_width</span><span class="o">-</span><span class="n">padding_left</span> <span class="o">&lt;</span> <span class="mi">2</span><span class="p">:</span> <span class="c1"># unicode can have 2 char width</span>
<span class="k">return</span>
<span class="n">yi</span> <span class="o">=</span> <span class="n">padding_top</span>
<span class="c1">#for row in string.split(&quot;\n&quot;):</span>
<span class="c1"># window.addnstr(yi, x, row, win_width-x-1, curses.color_pair(9)) # 5</span>
<span class="c1"># yi += 1</span>
<span class="k">for</span> <span class="n">row</span> <span class="ow">in</span> <span class="n">string</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span><span class="p">):</span> <span class="c1"># TODO: os.linesep?</span>
<span class="n">xi</span> <span class="o">=</span> <span class="n">padding_left</span>
<span class="k">for</span> <span class="n">char</span> <span class="ow">in</span> <span class="n">row</span><span class="p">:</span>
<span class="c1"># write only inside the window</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">yi</span> <span class="o">&gt;=</span> <span class="n">win_height</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">xi</span> <span class="o">&gt;=</span> <span class="n">win_width</span><span class="p">:</span>
<span class="c1"># do not write in the last char of window (last row bottom and last column right)</span>
<span class="c1"># unicodes may use multiple chars, this will raise an error for the last char in the window</span>
<span class="k">if</span> <span class="n">yi</span> <span class="o">==</span> <span class="n">win_height</span><span class="o">-</span><span class="mi">1</span> <span class="ow">and</span> <span class="n">xi</span> <span class="o">&gt;=</span> <span class="n">win_width</span><span class="o">-</span><span class="mi">1</span><span class="p">:</span>
<span class="k">break</span>
<span class="c1">#if yi == win_height-1 and xi &gt;= win_width-1:</span>
<span class="c1"># try:</span>
<span class="c1"># char.encode(&quot;ascii&quot;)</span>
<span class="c1"># except UnicodeEncodeError:</span>
<span class="c1"># break</span>
<span class="c1"># dont add str if empty braille char or simple space character</span>
<span class="k">if</span> <span class="n">char</span> <span class="o">!=</span> <span class="nb">chr</span><span class="p">(</span><span class="mh">0x2800</span><span class="p">)</span> <span class="ow">and</span> <span class="n">char</span> <span class="o">!=</span> <span class="s2">&quot; &quot;</span> <span class="ow">and</span> <span class="n">xi</span> <span class="o">&lt;</span> <span class="n">win_width</span> <span class="ow">and</span> <span class="n">yi</span> <span class="o">&lt;</span> <span class="n">win_height</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">window</span><span class="o">.</span><span class="n">addstr</span><span class="p">(</span><span class="n">yi</span><span class="p">,</span> <span class="n">xi</span><span class="p">,</span> <span class="n">char</span><span class="p">,</span> <span class="n">attribute</span><span class="o">|</span><span class="n">curses</span><span class="o">.</span><span class="n">color_pair</span><span class="p">(</span><span class="n">color_pair</span><span class="p">))</span>
<span class="n">xi</span> <span class="o">+=</span> <span class="mi">1</span>
<span class="n">yi</span> <span class="o">+=</span> <span class="mi">1</span></div>
<div class="viewcode-block" id="Window.border"><a class="viewcode-back" href="../../pylib.tui.html#pylib.tui.Window.border">[docs]</a> <span class="k">def</span> <span class="nf">border</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">title</span><span class="o">=</span><span class="s2">&quot;&quot;</span><span class="p">,</span> <span class="n">footer_left</span><span class="o">=</span><span class="s2">&quot;&quot;</span><span class="p">,</span> <span class="n">footer_right</span><span class="o">=</span><span class="s2">&quot;&quot;</span><span class="p">,</span> <span class="n">style</span><span class="o">=</span><span class="s2">&quot;horizontal&quot;</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Set border around the window with optional title and footer</span>
<span class="sd"> labels.</span>
<span class="sd"> :param window: the window to draw a border</span>
<span class="sd"> :type window: curses.window</span>
<span class="sd"> :param title: the title for the window (default = &quot;&quot;)</span>
<span class="sd"> :type title: str</span>
<span class="sd"> :param footer_left: the footer label (default = &quot;&quot;). If footer_left</span>
<span class="sd"> is a list than every element of the list will be printed sperated</span>
<span class="sd"> by one column. This is useful to not overwright the border with a</span>
<span class="sd"> space character.</span>
<span class="sd"> :type footer_left: str or list</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">win_height</span><span class="p">,</span> <span class="n">win_width</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">window</span><span class="o">.</span><span class="n">getmaxyx</span><span class="p">()</span>
<span class="k">if</span> <span class="n">win_width</span> <span class="o">&lt;</span> <span class="mi">3</span><span class="p">:</span>
<span class="k">return</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">style</span><span class="p">,</span> <span class="nb">str</span><span class="p">):</span>
<span class="k">if</span> <span class="n">style</span> <span class="o">==</span> <span class="s2">&quot;horizontal&quot;</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">window</span><span class="o">.</span><span class="n">border</span><span class="p">(</span>
<span class="s1">&#39; &#39;</span><span class="p">,</span>
<span class="s1">&#39; &#39;</span><span class="p">,</span>
<span class="n">curses</span><span class="o">.</span><span class="n">ACS_HLINE</span><span class="p">,</span>
<span class="n">curses</span><span class="o">.</span><span class="n">ACS_HLINE</span><span class="p">,</span>
<span class="n">curses</span><span class="o">.</span><span class="n">ACS_HLINE</span><span class="p">,</span>
<span class="n">curses</span><span class="o">.</span><span class="n">ACS_HLINE</span><span class="p">,</span>
<span class="n">curses</span><span class="o">.</span><span class="n">ACS_HLINE</span><span class="p">,</span>
<span class="n">curses</span><span class="o">.</span><span class="n">ACS_HLINE</span><span class="p">,</span>
<span class="p">)</span>
<span class="k">elif</span> <span class="n">style</span> <span class="o">==</span> <span class="s2">&quot;full&quot;</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">window</span><span class="o">.</span><span class="n">border</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="p">)</span>
<span class="k">else</span><span class="p">:</span> <span class="c1"># list</span>
<span class="bp">self</span><span class="o">.</span><span class="n">window</span><span class="o">.</span><span class="n">border</span><span class="p">(</span><span class="o">*</span><span class="n">style</span><span class="p">)</span>
<span class="k">if</span> <span class="n">title</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">text</span><span class="p">(</span><span class="n">title</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
<span class="k">if</span> <span class="n">footer_left</span><span class="p">:</span>
<span class="n">last_win_row</span> <span class="o">=</span> <span class="n">win_height</span> <span class="o">-</span> <span class="mi">1</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">footer_left</span><span class="p">,</span> <span class="nb">str</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">text</span><span class="p">(</span><span class="n">footer_left</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="n">last_win_row</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span> <span class="c1"># list</span>
<span class="n">pos</span> <span class="o">=</span> <span class="mi">1</span>
<span class="k">for</span> <span class="n">footer_left_i</span> <span class="ow">in</span> <span class="n">footer_left</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">text</span><span class="p">(</span><span class="n">footer_left_i</span><span class="p">,</span> <span class="n">pos</span><span class="p">,</span> <span class="n">win_height</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span>
<span class="n">pos</span> <span class="o">+=</span> <span class="nb">len</span><span class="p">(</span><span class="n">footer_left_i</span><span class="p">)</span><span class="o">+</span><span class="mi">1</span>
<span class="k">if</span> <span class="n">footer_right</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">text</span><span class="p">(</span><span class="n">footer_right</span><span class="p">,</span> <span class="n">win_width</span> <span class="o">-</span> <span class="mi">1</span> <span class="o">-</span> <span class="nb">len</span><span class="p">(</span><span class="n">footer_right</span><span class="p">),</span> <span class="n">last_win_row</span><span class="p">)</span></div>
<div class="viewcode-block" id="Window.textbox"><a class="viewcode-back" href="../../pylib.tui.html#pylib.tui.Window.textbox">[docs]</a> <span class="k">def</span> <span class="nf">textbox</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">height</span><span class="p">,</span> <span class="n">width</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">x</span><span class="p">,</span> <span class="n">borders</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Add sub window.</span>
<span class="sd"> :param parent_window: the parent window</span>
<span class="sd"> :type parent_window: curses.window</span>
<span class="sd"> :param height: the height of the sub window. The reference point of</span>
<span class="sd"> the sub window is the top left corner.</span>
<span class="sd"> :type height: int</span>
<span class="sd"> :param width: the width of the sub window. The reference point of</span>
<span class="sd"> the sub window is the top left corner.</span>
<span class="sd"> :type width: int</span>
<span class="sd"> :param y: the y coordinate (position) of the sub window. Start from</span>
<span class="sd"> the top.</span>
<span class="sd"> :type y: int</span>
<span class="sd"> :param x: the x coordinate (position) of the sub window. Start from</span>
<span class="sd"> the left.</span>
<span class="sd"> :returns: the sub window content and decoration</span>
<span class="sd"> :rtype: (curses.window, curses.window)</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="c1"># TODO: not to work with two window object but one with the</span>
<span class="c1"># possibility to access the derwin(s). Either self.derwins</span>
<span class="c1"># or another DoubleWindow class for border and text or do it</span>
<span class="c1"># in this class?</span>
<span class="n">screen_height</span><span class="p">,</span> <span class="n">screen_width</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">window</span><span class="o">.</span><span class="n">getmaxyx</span><span class="p">()</span>
<span class="n">newwin_width</span> <span class="o">=</span> <span class="n">screen_width</span><span class="o">-</span><span class="n">x</span> <span class="k">if</span> <span class="n">x</span><span class="o">+</span><span class="n">width</span> <span class="o">&gt;</span> <span class="n">screen_width</span> <span class="k">else</span> <span class="n">width</span>
<span class="n">newwin_height</span> <span class="o">=</span> <span class="n">screen_height</span><span class="o">-</span><span class="n">y</span> <span class="k">if</span> <span class="n">y</span><span class="o">+</span><span class="n">height</span> <span class="o">&gt;</span> <span class="n">screen_height</span> <span class="k">else</span> <span class="n">height</span>
<span class="k">if</span> <span class="n">newwin_width</span> <span class="o">&gt;</span> <span class="mi">0</span> <span class="ow">and</span> <span class="n">newwin_height</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
<span class="n">win</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">derwin</span><span class="p">(</span><span class="n">newwin_height</span><span class="p">,</span> <span class="n">newwin_width</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">x</span><span class="p">)</span>
<span class="k">if</span> <span class="n">borders</span><span class="p">:</span>
<span class="n">win</span><span class="o">.</span><span class="n">border</span><span class="p">(</span><span class="n">style</span><span class="o">=</span><span class="s2">&quot;full&quot;</span><span class="p">)</span>
<span class="k">if</span> <span class="n">newwin_width</span><span class="o">-</span><span class="mi">2</span> <span class="o">&gt;</span> <span class="mi">0</span> <span class="ow">and</span> <span class="n">newwin_height</span><span class="o">-</span><span class="mi">1</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
<span class="n">subwin</span> <span class="o">=</span> <span class="n">win</span><span class="o">.</span><span class="n">derwin</span><span class="p">(</span><span class="n">newwin_height</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="n">newwin_width</span><span class="o">-</span><span class="mi">2</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
<span class="k">return</span> <span class="n">subwin</span><span class="p">,</span> <span class="n">win</span> <span class="c1"># text and border</span>
<span class="k">return</span> <span class="n">newwin</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">),</span> <span class="n">win</span> <span class="c1"># only border, no text (top left 1 char)</span>
<span class="k">return</span> <span class="n">win</span><span class="p">,</span> <span class="n">newwin</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span> <span class="c1"># only text, no border (top left 1 char)</span>
<span class="k">return</span> <span class="n">newwin</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">),</span> <span class="n">newwin</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span> <span class="c1"># no border and no text (top left 1 char)</span></div>
<div class="viewcode-block" id="Window.refresh"><a class="viewcode-back" href="../../pylib.tui.html#pylib.tui.Window.refresh">[docs]</a> <span class="k">def</span> <span class="nf">refresh</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">window</span><span class="o">.</span><span class="n">refresh</span><span class="p">()</span></div></div>
</pre></div>
</div>
</div>
</div>
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
<div class="sphinxsidebarwrapper">
<h1 class="logo"><a href="../../index.html">pylib</a></h1>
<h3>Navigation</h3>
<p class="caption"><span class="caption-text">Contents:</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../modules.html">pylib</a></li>
</ul>
<div class="relations">
<h3>Related Topics</h3>
<ul>
<li><a href="../../index.html">Documentation overview</a><ul>
<li><a href="../index.html">Module code</a><ul>
</ul></li>
</ul></li>
</ul>
</div>
<div id="searchbox" style="display: none" role="search">
<h3 id="searchlabel">Quick search</h3>
<div class="searchformwrapper">
<form class="search" action="../../search.html" method="get">
<input type="text" name="q" aria-labelledby="searchlabel" />
<input type="submit" value="Go" />
</form>
</div>
</div>
<script type="text/javascript">$('#searchbox').show(0);</script>
</div>
</div>
<div class="clearer"></div>
</div>
<div class="footer">
&copy;2019, Daniel Weschke.
|
Powered by <a href="http://sphinx-doc.org/">Sphinx 2.2.1</a>
&amp; <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.12</a>
</div>
</body>
</html>

View File

@@ -15,8 +15,39 @@ Welcome to pylib's documentation!
Indices and tables
==================
------------------
* :ref:`genindex`
* :ref:`modindex`
* :ref:`search`
tui
---
pylib/tui.py is the main module for tui 'terminal user interface' programs.
* curses package (for Windows install windows-curses) is the underlying main
package to build terminal programs. The curses package can also be used
directly.
* Windows (Anaconda):
* ``C:\PathToAnaconda3\condabin\conda.bat activate base``
* ``python -m pip install windows-curses``
* https://github.com/zephyrproject-rtos/windows-curses
* drawille package is used to draw with braille characters (dottet and quasi-
line charts). Make sure you use a font with Unicode Braille characters. For
Windows e. g.: NSimSun, MS Gothic.
* Install: ``python -m pip install drawille``
* Windows (Anaconda):
* ``C:\PathToAnaconda3\condabin\conda.bat activate base``
* ``python -m pip install drawille``
* drawblock.py is used to draw with block characters (histogram).
example/tui.py is an example script to build a terminal program.

View File

@@ -32,3 +32,4 @@ Submodules
pylib.helper
pylib.mathematics
pylib.time_of_day
pylib.tui

View File

@@ -0,0 +1,7 @@
pylib.tui module
================
.. automodule:: pylib.tui
:members:
:undoc-members:
:show-inheritance:

View File

@@ -186,15 +186,17 @@
</li>
<li><a href="pylib.function.html#pylib.function.b_spline_curve_with_knots">b_spline_curve_with_knots() (in module pylib.function)</a>
</li>
</ul></td>
<td style="width: 33%; vertical-align: top;"><ul>
<li><a href="pylib.data_step.html#pylib.data_step.b_spline_curve_with_knots_geometry">b_spline_curve_with_knots_geometry() (in module pylib.data_step)</a>
</li>
</ul></td>
<td style="width: 33%; vertical-align: top;"><ul>
<li><a href="pylib.function.html#pylib.function.b_spline_knots">b_spline_knots() (in module pylib.function)</a>
</li>
<li><a href="pylib.data_step_std.html#pylib.data_step_std.boolean_choose">boolean_choose() (in module pylib.data_step_std)</a>
</li>
<li><a href="pylib.data_step_std.html#pylib.data_step_std.BOOLEAN_to_bool">BOOLEAN_to_bool() (in module pylib.data_step_std)</a>
</li>
<li><a href="pylib.tui.html#pylib.tui.Window.border">border() (Window method)</a>
</li>
<li><a href="pylib.data_step_std.html#pylib.data_step_std.BOUNDED_CURVE">BOUNDED_CURVE (class in pylib.data_step_std)</a>
</li>
@@ -209,6 +211,8 @@
<li><a href="pylib.geometry_plot_pylab.html#pylib.geometry_plot_pylab.cad_wireframe">cad_wireframe() (in module pylib.geometry_plot_pylab)</a>
</li>
<li><a href="pylib.data_step_std.html#pylib.data_step_std.CARTESIAN_POINT">CARTESIAN_POINT (class in pylib.data_step_std)</a>
</li>
<li><a href="pylib.helper.html#pylib.helper.cd">cd (class in pylib.helper)</a>
</li>
<li><a href="pylib.geometry.html#pylib.geometry.World.center">center() (World method)</a>
</li>
@@ -230,8 +234,18 @@
</li>
<li><a href="pylib.geometry.html#pylib.geometry.Properties.circle_sectors">circle_sectors (Properties attribute)</a>
</li>
<li><a href="pylib.tui.html#pylib.tui.TUI.clear">clear() (TUI method)</a>
<ul>
<li><a href="pylib.tui.html#pylib.tui.Window.clear">(Window method)</a>
</li>
</ul></li>
</ul></td>
<td style="width: 33%; vertical-align: top;"><ul>
<li><a href="pylib.tui.html#pylib.tui.TUI.color_def">color_def() (TUI method)</a>
</li>
<li><a href="pylib.tui.html#pylib.tui.TUI.color_table">color_table() (TUI method)</a>
</li>
<li><a href="pylib.data_step_std.html#pylib.data_step_std.CONIC">CONIC (class in pylib.data_step_std)</a>
</li>
<li><a href="pylib.mathematics.html#pylib.mathematics.vector.conjugate">conjugate() (vector static method)</a>
@@ -278,13 +292,15 @@
</li>
<li><a href="pylib.data_step_std.html#module-data_step_std">data_step_std (module)</a>
</li>
</ul></td>
<td style="width: 33%; vertical-align: top;"><ul>
<li><a href="pylib.date.html#module-date">date (module)</a>
</li>
</ul></td>
<td style="width: 33%; vertical-align: top;"><ul>
<li><a href="pylib.time_of_day.html#pylib.time_of_day.days">days() (in module pylib.time_of_day)</a>
</li>
<li><a href="pylib.time_of_day.html#pylib.time_of_day.days_norm">days_norm() (in module pylib.time_of_day)</a>
</li>
<li><a href="pylib.tui.html#pylib.tui.Window.derwin">derwin() (Window method)</a>
</li>
<li><a href="pylib.data_step_std.html#pylib.data_step_std.dimension_of">dimension_of() (in module pylib.data_step_std)</a>
</li>
@@ -316,10 +332,10 @@
</li>
<li><a href="pylib.date.html#pylib.date.easter_sunday">easter_sunday() (in module pylib.date)</a>
</li>
</ul></td>
<td style="width: 33%; vertical-align: top;"><ul>
<li><a href="pylib.data_step_std.html#pylib.data_step_std.EDGE">EDGE (class in pylib.data_step_std)</a>
</li>
</ul></td>
<td style="width: 33%; vertical-align: top;"><ul>
<li><a href="pylib.data_step_std.html#pylib.data_step_std.EDGE_CURVE">EDGE_CURVE (class in pylib.data_step_std)</a>
</li>
<li><a href="pylib.data_step_std.html#pylib.data_step_std.EDGE_LOOP">EDGE_LOOP (class in pylib.data_step_std)</a>
@@ -329,6 +345,8 @@
<li><a href="pylib.geometry.html#pylib.geometry.Ellipse">Ellipse (class in pylib.geometry)</a>
</li>
<li><a href="pylib.function.html#pylib.function.ellipse">ellipse() (in module pylib.function)</a>
</li>
<li><a href="pylib.tui.html#pylib.tui.TUI.end">end() (TUI method)</a>
</li>
<li><a href="pylib.function.html#pylib.function.epitrochoid">epitrochoid() (in module pylib.function)</a>
</li>
@@ -368,12 +386,12 @@
</li>
<li><a href="pylib.geometry.html#module-geometry">geometry (module)</a>
</li>
</ul></td>
<td style="width: 33%; vertical-align: top;"><ul>
<li><a href="pylib.geometry2d.html#module-geometry2d">geometry2d (module)</a>
</li>
<li><a href="pylib.geometry2d_plot.html#module-geometry2d_plot">geometry2d_plot (module)</a>
</li>
</ul></td>
<td style="width: 33%; vertical-align: top;"><ul>
<li><a href="pylib.geometry_plot.html#module-geometry_plot">geometry_plot (module)</a>
</li>
<li><a href="pylib.geometry_plot_pylab.html#module-geometry_plot_pylab">geometry_plot_pylab (module)</a>
@@ -381,6 +399,16 @@
<li><a href="pylib.geometry.html#pylib.geometry.CS.get_coordinates">get_coordinates() (CS method)</a>
</li>
<li><a href="pylib.data.html#pylib.data.get_id">get_id() (in module pylib.data)</a>
</li>
<li><a href="pylib.tui.html#pylib.tui.StdOutWrapper.get_text">get_text() (StdOutWrapper method)</a>
</li>
<li><a href="pylib.tui.html#pylib.tui.TUI.getch">getch() (TUI method)</a>
<ul>
<li><a href="pylib.tui.html#pylib.tui.Window.getch">(Window method)</a>
</li>
</ul></li>
<li><a href="pylib.tui.html#pylib.tui.Window.getmaxyx">getmaxyx() (Window method)</a>
</li>
</ul></td>
</tr></table>
@@ -417,9 +445,13 @@
<li><a href="pylib.time_of_day.html#pylib.time_of_day.in_seconds">in_seconds() (in module pylib.time_of_day)</a>
</li>
<li><a href="pylib.geometry.html#pylib.geometry.CS.init_xyz">init_xyz() (CS class method)</a>
</li>
<li><a href="pylib.tui.html#pylib.tui.Window.initscr">initscr() (Window method)</a>
</li>
</ul></td>
<td style="width: 33%; vertical-align: top;"><ul>
<li><a href="pylib.tui.html#pylib.tui.Window.instr">instr() (Window method)</a>
</li>
<li><a href="pylib.numerical.integration.html#module-integration">integration (module)</a>
</li>
<li><a href="pylib.geometry2d.html#pylib.geometry2d.interpolate_hermite">interpolate_hermite() (in module pylib.geometry2d)</a>
@@ -484,6 +516,8 @@
</li>
</ul></td>
<td style="width: 33%; vertical-align: top;"><ul>
<li><a href="pylib.tui.html#pylib.tui.newwin">newwin() (in module pylib.tui)</a>
</li>
<li><a href="pylib.mathematics.html#pylib.mathematics.vector.normalize">normalize() (vector method)</a>
</li>
<li><a href="pylib.mathematics.html#pylib.mathematics.vector.normalized">normalized() (vector static method)</a>
@@ -585,6 +619,8 @@
<li><a href="pylib.numerical.ode_model.html#module-pylib.numerical.ode_model">pylib.numerical.ode_model (module)</a>
</li>
<li><a href="pylib.time_of_day.html#module-pylib.time_of_day">pylib.time_of_day (module)</a>
</li>
<li><a href="pylib.tui.html#module-pylib.tui">pylib.tui (module)</a>
</li>
</ul></td>
</tr></table>
@@ -602,6 +638,12 @@
</li>
<li><a href="pylib.geometry2d.html#pylib.geometry2d.rectangle">rectangle() (in module pylib.geometry2d)</a>
</li>
<li><a href="pylib.tui.html#pylib.tui.TUI.refresh">refresh() (TUI method)</a>
<ul>
<li><a href="pylib.tui.html#pylib.tui.Window.refresh">(Window method)</a>
</li>
</ul></li>
<li><a href="pylib.data_step_std.html#pylib.data_step_std.REPRESENTATION_ITEM">REPRESENTATION_ITEM (class in pylib.data_step_std)</a>
</li>
<li><a href="pylib.geometry2d.html#pylib.geometry2d.rotate">rotate() (in module pylib.geometry2d)</a>
@@ -642,6 +684,8 @@
<li><a href="pylib.geometry.html#pylib.geometry.World.rotate_z">(World method)</a>
</li>
</ul></li>
<li><a href="pylib.helper.html#pylib.helper.run_file">run_file() (in module pylib.helper)</a>
</li>
<li><a href="pylib.mathematics.html#pylib.mathematics.matrix.rx">rx() (matrix static method)</a>
</li>
<li><a href="pylib.mathematics.html#pylib.mathematics.matrix.ry">ry() (matrix static method)</a>
@@ -695,6 +739,8 @@
<li><a href="pylib.geometry.html#pylib.geometry.World.space_diagonal">space_diagonal() (World method)</a>
</li>
<li><a href="pylib.geometry2d.html#pylib.geometry2d.square">square() (in module pylib.geometry2d)</a>
</li>
<li><a href="pylib.tui.html#pylib.tui.StdOutWrapper">StdOutWrapper (class in pylib.tui)</a>
</li>
<li><a href="pylib.data_step.html#pylib.data_step.step">step (class in pylib.data_step)</a>
</li>
@@ -715,6 +761,12 @@
<table style="width: 100%" class="indextable genindextable"><tr>
<td style="width: 33%; vertical-align: top;"><ul>
<li><a href="pylib.mathematics.html#pylib.mathematics.matrix.t">t() (matrix static method)</a>
</li>
<li><a href="pylib.tui.html#pylib.tui.StdOutWrapper.text">text (StdOutWrapper attribute)</a>
</li>
<li><a href="pylib.tui.html#pylib.tui.Window.text">text() (Window method)</a>
</li>
<li><a href="pylib.tui.html#pylib.tui.Window.textbox">textbox() (Window method)</a>
</li>
<li><a href="pylib.time_of_day.html#module-time_of_day">time_of_day (module)</a>
</li>
@@ -751,6 +803,10 @@
<li><a href="pylib.mathematics.html#pylib.mathematics.matrix.transposed">transposed() (matrix static method)</a>
</li>
<li><a href="pylib.numerical.integration.html#pylib.numerical.integration.trapez">trapez() (in module pylib.numerical.integration)</a>
</li>
<li><a href="pylib.tui.html#pylib.tui.TUI">TUI (class in pylib.tui)</a>
</li>
<li><a href="pylib.tui.html#module-tui">tui (module)</a>
</li>
</ul></td>
</tr></table>
@@ -788,6 +844,8 @@
<h2 id="W">W</h2>
<table style="width: 100%" class="indextable genindextable"><tr>
<td style="width: 33%; vertical-align: top;"><ul>
<li><a href="pylib.tui.html#pylib.tui.Window">Window (class in pylib.tui)</a>
</li>
<li><a href="pylib.geometry_plot_pylab.html#pylib.geometry_plot_pylab.wireframe3d">wireframe3d() (in module pylib.geometry_plot_pylab)</a>
</li>
<li><a href="pylib.geometry.html#pylib.geometry.Solid.wireframes">wireframes() (Solid method)</a>
@@ -805,7 +863,11 @@
<li><a href="pylib.geometry.html#pylib.geometry.World">World (class in pylib.geometry)</a>
</li>
<li><a href="pylib.data.html#pylib.data.write">write() (in module pylib.data)</a>
<ul>
<li><a href="pylib.tui.html#pylib.tui.StdOutWrapper.write">(StdOutWrapper method)</a>
</li>
</ul></li>
</ul></td>
</tr></table>

View File

@@ -44,14 +44,48 @@
</li>
</ul>
</div>
</div>
<div class="section" id="indices-and-tables">
<h1>Indices and tables<a class="headerlink" href="#indices-and-tables" title="Permalink to this headline"></a></h1>
<h2>Indices and tables<a class="headerlink" href="#indices-and-tables" title="Permalink to this headline"></a></h2>
<ul class="simple">
<li><p><a class="reference internal" href="genindex.html"><span class="std std-ref">Index</span></a></p></li>
<li><p><a class="reference internal" href="py-modindex.html"><span class="std std-ref">Module Index</span></a></p></li>
<li><p><a class="reference internal" href="search.html"><span class="std std-ref">Search Page</span></a></p></li>
</ul>
</div>
<div class="section" id="tui">
<h2>tui<a class="headerlink" href="#tui" title="Permalink to this headline"></a></h2>
<p>pylib/tui.py is the main module for tui terminal user interface programs.</p>
<ul class="simple">
<li><p>curses package (for Windows install windows-curses) is the underlying main
package to build terminal programs. The curses package can also be used
directly.</p>
<ul>
<li><p>Windows (Anaconda):</p>
<ul>
<li><p><code class="docutils literal notranslate"><span class="pre">C:\PathToAnaconda3\condabin\conda.bat</span> <span class="pre">activate</span> <span class="pre">base</span></code></p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">python</span> <span class="pre">-m</span> <span class="pre">pip</span> <span class="pre">install</span> <span class="pre">windows-curses</span></code></p></li>
<li><p><a class="reference external" href="https://github.com/zephyrproject-rtos/windows-curses">https://github.com/zephyrproject-rtos/windows-curses</a></p></li>
</ul>
</li>
</ul>
</li>
<li><p>drawille package is used to draw with braille characters (dottet and quasi-
line charts). Make sure you use a font with Unicode Braille characters. For
Windows e. g.: NSimSun, MS Gothic.</p>
<ul>
<li><p>Install: <code class="docutils literal notranslate"><span class="pre">python</span> <span class="pre">-m</span> <span class="pre">pip</span> <span class="pre">install</span> <span class="pre">drawille</span></code></p></li>
<li><p>Windows (Anaconda):</p>
<ul>
<li><p><code class="docutils literal notranslate"><span class="pre">C:\PathToAnaconda3\condabin\conda.bat</span> <span class="pre">activate</span> <span class="pre">base</span></code></p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">python</span> <span class="pre">-m</span> <span class="pre">pip</span> <span class="pre">install</span> <span class="pre">drawille</span></code></p></li>
</ul>
</li>
</ul>
</li>
<li><p>drawblock.py is used to draw with block characters (histogram).</p></li>
</ul>
<p>example/tui.py is an example script to build a terminal program.</p>
</div>
</div>

View File

@@ -61,6 +61,7 @@
<li class="toctree-l3"><a class="reference internal" href="pylib.helper.html">pylib.helper module</a></li>
<li class="toctree-l3"><a class="reference internal" href="pylib.mathematics.html">pylib.mathematics module</a></li>
<li class="toctree-l3"><a class="reference internal" href="pylib.time_of_day.html">pylib.time_of_day module</a></li>
<li class="toctree-l3"><a class="reference internal" href="pylib.tui.html">pylib.tui module</a></li>
</ul>
</li>
</ul>

Binary file not shown.

View File

@@ -261,6 +261,11 @@
<td>&#160;&#160;&#160;
<a href="pylib.time_of_day.html#module-pylib.time_of_day"><code class="xref">pylib.time_of_day</code></a></td><td>
<em></em></td></tr>
<tr class="cg-1">
<td></td>
<td>&#160;&#160;&#160;
<a href="pylib.tui.html#module-pylib.tui"><code class="xref">pylib.tui</code></a></td><td>
<em></em></td></tr>
<tr class="pcap"><td></td><td>&#160;</td><td></td></tr>
<tr class="cap" id="cap-t"><td></td><td>
<strong>t</strong></td><td></td></tr>
@@ -269,6 +274,11 @@
<td>
<a href="pylib.time_of_day.html#module-time_of_day"><code class="xref">time_of_day</code></a> <em>(*nix, Windows)</em></td><td>
<em>Calculate time.</em></td></tr>
<tr>
<td></td>
<td>
<a href="pylib.tui.html#module-tui"><code class="xref">tui</code></a> <em>(*nix, Windows)</em></td><td>
<em>TUI module.</em></td></tr>
</table>

View File

@@ -43,6 +43,41 @@
</dd>
</dl>
<span class="target" id="module-helper"></span><dl class="class">
<dt id="pylib.helper.cd">
<em class="property">class </em><code class="sig-name descname">cd</code><span class="sig-paren">(</span><em class="sig-param">new_path</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/pylib/helper.html#cd"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#pylib.helper.cd" title="Permalink to this definition"></a></dt>
<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">object</span></code></p>
<p>Context manager for changing the current working directory</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters</dt>
<dd class="field-odd"><p><strong>new_path</strong> (<em>string</em>) the directory to change into</p>
</dd>
<dt class="field-even">Example</dt>
<dd class="field-even"><p></p></dd>
</dl>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="c1"># enter the directory and run some code:</span>
<span class="k">with</span> <span class="n">cd</span><span class="p">(</span><span class="s2">&quot;~/tmp&quot;</span><span class="p">):</span>
<span class="c1"># we are now in ~/tmp</span>
<span class="c1"># code</span>
<span class="c1"># outside the context manager we are back where we started.</span>
</pre></div>
</div>
</dd></dl>
<dl class="function">
<dt id="pylib.helper.run_file">
<code class="sig-name descname">run_file</code><span class="sig-paren">(</span><em class="sig-param">file_name</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/pylib/helper.html#run_file"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#pylib.helper.run_file" title="Permalink to this definition"></a></dt>
<dd><p>Run a file.</p>
<p>Inside a pythin interpreter it changes to the directory of the
file and after excuting the file it changes back to the working
directory before.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters</dt>
<dd class="field-odd"><p><strong>file_name</strong> (<em>string</em>) the file to execute</p>
</dd>
</dl>
</dd></dl>
<dl class="class">
<dt id="pylib.helper.timeit">
<em class="property">class </em><code class="sig-name descname">timeit</code><span class="sig-paren">(</span><em class="sig-param">description=None</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/pylib/helper.html#timeit"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#pylib.helper.timeit" title="Permalink to this definition"></a></dt>
<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">contextlib.ContextDecorator</span></code></p>

View File

@@ -71,6 +71,7 @@
<li class="toctree-l1"><a class="reference internal" href="pylib.helper.html">pylib.helper module</a></li>
<li class="toctree-l1"><a class="reference internal" href="pylib.mathematics.html">pylib.mathematics module</a></li>
<li class="toctree-l1"><a class="reference internal" href="pylib.time_of_day.html">pylib.time_of_day module</a></li>
<li class="toctree-l1"><a class="reference internal" href="pylib.tui.html">pylib.tui module</a></li>
</ul>
</div>
</div>

View File

@@ -61,7 +61,8 @@
<dt class="field-odd">Example</dt>
<dd class="field-odd"><p></p></dd>
</dl>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">m</span> <span class="o">=</span> <span class="n">matrix</span><span class="p">([[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">0</span><span class="p">],</span> <span class="p">[</span><span class="mi">4</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">6</span><span class="p">,</span> <span class="mi">0</span><span class="p">],</span> <span class="p">[</span><span class="mi">7</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">9</span><span class="p">,</span> <span class="mi">0</span><span class="p">],</span> <span class="p">[</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">]])</span>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">m</span> <span class="o">=</span> <span class="n">matrix</span><span class="p">([[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">0</span><span class="p">],</span> <span class="p">[</span><span class="mi">4</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">6</span><span class="p">,</span> <span class="mi">0</span><span class="p">],</span> <span class="p">[</span><span class="mi">7</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">9</span><span class="p">,</span> <span class="mi">0</span><span class="p">],</span> \
<span class="go"> [0, 0, 0, 0]])</span>
<span class="gp">&gt;&gt;&gt; </span><span class="nb">print</span><span class="p">(</span><span class="n">m</span><span class="p">[:])</span>
<span class="go">[[1, 2, 3, 0], [4, 5, 6, 0], [7, 8, 9, 0], [0, 0, 0, 0]]</span>
<span class="gp">&gt;&gt;&gt; </span><span class="nb">print</span><span class="p">(</span><span class="n">m</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span>
@@ -442,7 +443,8 @@ filled with zeros.</p>
<dd class="field-even"><p></p></dd>
</dl>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">m</span> <span class="o">=</span> <span class="n">matrix</span><span class="o">.</span><span class="n">zeros</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">3</span><span class="p">)</span>
<span class="gp">&gt;&gt;&gt; </span><span class="nb">print</span><span class="p">(</span><span class="n">m</span><span class="p">)</span> <span class="p">[[</span><span class="mf">0.0</span><span class="p">,</span> <span class="mf">0.0</span><span class="p">,</span> <span class="mf">0.0</span><span class="p">],</span> <span class="p">[</span><span class="mf">0.0</span><span class="p">,</span> <span class="mf">0.0</span><span class="p">,</span> <span class="mf">0.0</span><span class="p">],</span> <span class="p">[</span><span class="mf">0.0</span><span class="p">,</span> <span class="mf">0.0</span><span class="p">,</span> <span class="mf">0.0</span><span class="p">]]</span>
<span class="gp">&gt;&gt;&gt; </span><span class="nb">print</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
<span class="go">[[0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0]]</span>
</pre></div>
</div>
</dd></dl>

328
docs/build/html/pylib.tui.html vendored Normal file
View File

@@ -0,0 +1,328 @@
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta charset="utf-8" />
<title>pylib.tui module &#8212; pylib 2019.12.21 documentation</title>
<link rel="stylesheet" href="_static/alabaster.css" type="text/css" />
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
<link rel="stylesheet" href="_static/custom.css" type="text/css" />
<script type="text/javascript" id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
<script type="text/javascript" src="_static/jquery.js"></script>
<script type="text/javascript" src="_static/underscore.js"></script>
<script type="text/javascript" src="_static/doctools.js"></script>
<script type="text/javascript" src="_static/language_data.js"></script>
<script async="async" type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/latest.js?config=TeX-AMS-MML_HTMLorMML"></script>
<link rel="index" title="Index" href="genindex.html" />
<link rel="search" title="Search" href="search.html" />
<link rel="prev" title="pylib.time_of_day module" href="pylib.time_of_day.html" />
<link rel="stylesheet" href="_static/custom.css" type="text/css" />
<meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9" />
</head><body>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<div class="body" role="main">
<div class="section" id="module-pylib.tui">
<span id="pylib-tui-module"></span><h1>pylib.tui module<a class="headerlink" href="#module-pylib.tui" title="Permalink to this headline"></a></h1>
<p>TUI module.</p>
<dl class="field-list simple">
<dt class="field-odd">Date</dt>
<dd class="field-odd"><p>2020-01-10</p>
</dd>
</dl>
<span class="target" id="module-tui"></span><dl class="class">
<dt id="pylib.tui.StdOutWrapper">
<em class="property">class </em><code class="sig-name descname">StdOutWrapper</code><a class="reference internal" href="_modules/pylib/tui.html#StdOutWrapper"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#pylib.tui.StdOutWrapper" title="Permalink to this definition"></a></dt>
<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">object</span></code></p>
<p>Send print to stdout (print to the standard console).</p>
<p>usage:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="c1"># catch all prints into StdOutWrapper</span>
<span class="n">mystdout</span> <span class="o">=</span> <span class="n">StdOutWrapper</span><span class="p">()</span>
<span class="n">sys</span><span class="o">.</span><span class="n">stdout</span> <span class="o">=</span> <span class="n">mystdout</span>
<span class="n">sys</span><span class="o">.</span><span class="n">stderr</span> <span class="o">=</span> <span class="n">mystdout</span>
<span class="c1"># begin curses (curses.initscr())</span>
<span class="c1"># do your stuff here</span>
<span class="c1"># print(&quot;foo&quot;)</span>
<span class="c1"># you can also output mystdout.get_text() in a ncurses widget in</span>
<span class="c1"># runtime</span>
<span class="c1"># end curses (curses.endwin())</span>
<span class="c1"># go back to normal state and print all catched prints to stdout</span>
<span class="n">sys</span><span class="o">.</span><span class="n">stdout</span> <span class="o">=</span> <span class="n">sys</span><span class="o">.</span><span class="n">__stdout__</span>
<span class="n">sys</span><span class="o">.</span><span class="n">stderr</span> <span class="o">=</span> <span class="n">sys</span><span class="o">.</span><span class="n">__stderr__</span>
<span class="n">sys</span><span class="o">.</span><span class="n">stdout</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">mystdout</span><span class="o">.</span><span class="n">get_text</span><span class="p">())</span>
</pre></div>
</div>
<dl class="simple">
<dt>source:</dt><dd><p><a class="reference external" href="https://stackoverflow.com/a/14010948">https://stackoverflow.com/a/14010948</a></p>
</dd>
</dl>
<dl class="method">
<dt id="pylib.tui.StdOutWrapper.get_text">
<code class="sig-name descname">get_text</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="_modules/pylib/tui.html#StdOutWrapper.get_text"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#pylib.tui.StdOutWrapper.get_text" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="attribute">
<dt id="pylib.tui.StdOutWrapper.text">
<code class="sig-name descname">text</code><em class="property"> = ''</em><a class="headerlink" href="#pylib.tui.StdOutWrapper.text" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="method">
<dt id="pylib.tui.StdOutWrapper.write">
<code class="sig-name descname">write</code><span class="sig-paren">(</span><em class="sig-param">txt</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/pylib/tui.html#StdOutWrapper.write"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#pylib.tui.StdOutWrapper.write" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
</dd></dl>
<dl class="class">
<dt id="pylib.tui.TUI">
<em class="property">class </em><code class="sig-name descname">TUI</code><span class="sig-paren">(</span><em class="sig-param">delay=5</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/pylib/tui.html#TUI"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#pylib.tui.TUI" title="Permalink to this definition"></a></dt>
<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">object</span></code></p>
<p>TUI text-based user interface</p>
<p>initscr is the encapsulation window object of the stdscr
stdsc is the curses.initscr</p>
<dl class="method">
<dt id="pylib.tui.TUI.clear">
<code class="sig-name descname">clear</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="_modules/pylib/tui.html#TUI.clear"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#pylib.tui.TUI.clear" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="method">
<dt id="pylib.tui.TUI.color_def">
<code class="sig-name descname">color_def</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="_modules/pylib/tui.html#TUI.color_def"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#pylib.tui.TUI.color_def" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="method">
<dt id="pylib.tui.TUI.color_table">
<code class="sig-name descname">color_table</code><span class="sig-paren">(</span><em class="sig-param">window=None</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/pylib/tui.html#TUI.color_table"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#pylib.tui.TUI.color_table" title="Permalink to this definition"></a></dt>
<dd><p>Print all available colors with default background.
Check if curses.has_colors() is True.</p>
</dd></dl>
<dl class="method">
<dt id="pylib.tui.TUI.end">
<code class="sig-name descname">end</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="_modules/pylib/tui.html#TUI.end"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#pylib.tui.TUI.end" title="Permalink to this definition"></a></dt>
<dd><p>clean up</p>
</dd></dl>
<dl class="method">
<dt id="pylib.tui.TUI.getch">
<code class="sig-name descname">getch</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="_modules/pylib/tui.html#TUI.getch"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#pylib.tui.TUI.getch" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="method">
<dt id="pylib.tui.TUI.refresh">
<code class="sig-name descname">refresh</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="_modules/pylib/tui.html#TUI.refresh"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#pylib.tui.TUI.refresh" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
</dd></dl>
<dl class="class">
<dt id="pylib.tui.Window">
<em class="property">class </em><code class="sig-name descname">Window</code><a class="reference internal" href="_modules/pylib/tui.html#Window"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#pylib.tui.Window" title="Permalink to this definition"></a></dt>
<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">object</span></code></p>
<dl class="method">
<dt id="pylib.tui.Window.border">
<code class="sig-name descname">border</code><span class="sig-paren">(</span><em class="sig-param">title=''</em>, <em class="sig-param">footer_left=''</em>, <em class="sig-param">footer_right=''</em>, <em class="sig-param">style='horizontal'</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/pylib/tui.html#Window.border"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#pylib.tui.Window.border" title="Permalink to this definition"></a></dt>
<dd><p>Set border around the window with optional title and footer
labels.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters</dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>window</strong> (<em>curses.window</em>) the window to draw a border</p></li>
<li><p><strong>title</strong> (<em>str</em>) the title for the window (default = “”)</p></li>
<li><p><strong>footer_left</strong> (<em>str</em><em> or </em><em>list</em>) the footer label (default = “”). If footer_left
is a list than every element of the list will be printed sperated
by one column. This is useful to not overwright the border with a
space character.</p></li>
</ul>
</dd>
</dl>
</dd></dl>
<dl class="method">
<dt id="pylib.tui.Window.clear">
<code class="sig-name descname">clear</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="_modules/pylib/tui.html#Window.clear"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#pylib.tui.Window.clear" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="method">
<dt id="pylib.tui.Window.derwin">
<code class="sig-name descname">derwin</code><span class="sig-paren">(</span><em class="sig-param">height</em>, <em class="sig-param">width</em>, <em class="sig-param">y</em>, <em class="sig-param">x</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/pylib/tui.html#Window.derwin"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#pylib.tui.Window.derwin" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="method">
<dt id="pylib.tui.Window.getch">
<code class="sig-name descname">getch</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="_modules/pylib/tui.html#Window.getch"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#pylib.tui.Window.getch" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="method">
<dt id="pylib.tui.Window.getmaxyx">
<code class="sig-name descname">getmaxyx</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="_modules/pylib/tui.html#Window.getmaxyx"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#pylib.tui.Window.getmaxyx" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="method">
<dt id="pylib.tui.Window.initscr">
<code class="sig-name descname">initscr</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="_modules/pylib/tui.html#Window.initscr"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#pylib.tui.Window.initscr" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="method">
<dt id="pylib.tui.Window.instr">
<code class="sig-name descname">instr</code><span class="sig-paren">(</span><em class="sig-param">y</em>, <em class="sig-param">x</em>, <em class="sig-param">n</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/pylib/tui.html#Window.instr"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#pylib.tui.Window.instr" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="method">
<dt id="pylib.tui.Window.refresh">
<code class="sig-name descname">refresh</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="_modules/pylib/tui.html#Window.refresh"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#pylib.tui.Window.refresh" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="method">
<dt id="pylib.tui.Window.text">
<code class="sig-name descname">text</code><span class="sig-paren">(</span><em class="sig-param">string</em>, <em class="sig-param">padding_left=0</em>, <em class="sig-param">padding_top=0</em>, <em class="sig-param">attribute=0</em>, <em class="sig-param">color_pair=0</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/pylib/tui.html#Window.text"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#pylib.tui.Window.text" title="Permalink to this definition"></a></dt>
<dd><p>Test to screen. If multiline than keep the x position for
each new line.</p>
<dl class="field-list simple">
<dt class="field-odd">Example</dt>
<dd class="field-odd"><p></p></dd>
</dl>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">text</span><span class="p">(</span><span class="n">stdscr</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="s2">&quot;1 - Show test page&quot;</span><span class="p">)</span>
<span class="n">text</span><span class="p">(</span><span class="n">stdscr</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="s2">&quot;h - Show help page&quot;</span><span class="p">)</span>
<span class="n">text</span><span class="p">(</span><span class="n">stdscr</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="s2">&quot;q - Exit&quot;</span><span class="p">)</span>
<span class="n">text</span><span class="p">(</span><span class="n">stdscr</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span>
<span class="s2">&quot;1 - Show test page</span><span class="se">\\</span><span class="s2">n&quot;</span> <span class="o">+</span>
<span class="s2">&quot;h - Show help page</span><span class="se">\\</span><span class="s2">n&quot;</span> <span class="o">+</span>
<span class="s2">&quot;q - Exit&quot;</span><span class="p">)</span>
</pre></div>
</div>
<div class="admonition note">
<p class="admonition-title">Note</p>
<p>Writing in the last char of the window (last row bottom and
last column right) is suppressed</p>
</div>
</dd></dl>
<dl class="method">
<dt id="pylib.tui.Window.textbox">
<code class="sig-name descname">textbox</code><span class="sig-paren">(</span><em class="sig-param">height</em>, <em class="sig-param">width</em>, <em class="sig-param">y</em>, <em class="sig-param">x</em>, <em class="sig-param">borders=False</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/pylib/tui.html#Window.textbox"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#pylib.tui.Window.textbox" title="Permalink to this definition"></a></dt>
<dd><p>Add sub window.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters</dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>parent_window</strong> (<em>curses.window</em>) the parent window</p></li>
<li><p><strong>height</strong> (<em>int</em>) the height of the sub window. The reference point of
the sub window is the top left corner.</p></li>
<li><p><strong>width</strong> (<em>int</em>) the width of the sub window. The reference point of
the sub window is the top left corner.</p></li>
<li><p><strong>y</strong> (<em>int</em>) the y coordinate (position) of the sub window. Start from
the top.</p></li>
<li><p><strong>x</strong> the x coordinate (position) of the sub window. Start from
the left.</p></li>
</ul>
</dd>
<dt class="field-even">Returns</dt>
<dd class="field-even"><p>the sub window content and decoration</p>
</dd>
<dt class="field-odd">Return type</dt>
<dd class="field-odd"><p>(curses.window, curses.window)</p>
</dd>
</dl>
</dd></dl>
</dd></dl>
<dl class="function">
<dt id="pylib.tui.newwin">
<code class="sig-name descname">newwin</code><span class="sig-paren">(</span><em class="sig-param">height</em>, <em class="sig-param">width</em>, <em class="sig-param">y</em>, <em class="sig-param">x</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/pylib/tui.html#newwin"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#pylib.tui.newwin" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
</div>
</div>
</div>
</div>
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
<div class="sphinxsidebarwrapper">
<h1 class="logo"><a href="index.html">pylib</a></h1>
<h3>Navigation</h3>
<p class="caption"><span class="caption-text">Contents:</span></p>
<ul class="current">
<li class="toctree-l1 current"><a class="reference internal" href="modules.html">pylib</a><ul class="current">
<li class="toctree-l2 current"><a class="reference internal" href="pylib.html">pylib package</a></li>
</ul>
</li>
</ul>
<div class="relations">
<h3>Related Topics</h3>
<ul>
<li><a href="index.html">Documentation overview</a><ul>
<li><a href="modules.html">pylib</a><ul>
<li><a href="pylib.html">pylib package</a><ul>
<li>Previous: <a href="pylib.time_of_day.html" title="previous chapter">pylib.time_of_day module</a></li>
</ul></li>
</ul></li>
</ul></li>
</ul>
</div>
<div id="searchbox" style="display: none" role="search">
<h3 id="searchlabel">Quick search</h3>
<div class="searchformwrapper">
<form class="search" action="search.html" method="get">
<input type="text" name="q" aria-labelledby="searchlabel" />
<input type="submit" value="Go" />
</form>
</div>
</div>
<script type="text/javascript">$('#searchbox').show(0);</script>
</div>
</div>
<div class="clearer"></div>
</div>
<div class="footer">
&copy;2019, Daniel Weschke.
|
Powered by <a href="http://sphinx-doc.org/">Sphinx 2.2.1</a>
&amp; <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.12</a>
|
<a href="_sources/pylib.tui.rst.txt"
rel="nofollow">Page source</a>
</div>
</body>
</html>

File diff suppressed because one or more lines are too long

View File

@@ -15,8 +15,39 @@ Welcome to pylib's documentation!
Indices and tables
==================
------------------
* :ref:`genindex`
* :ref:`modindex`
* :ref:`search`
tui
---
pylib/tui.py is the main module for tui 'terminal user interface' programs.
* curses package (for Windows install windows-curses) is the underlying main
package to build terminal programs. The curses package can also be used
directly.
* Windows (Anaconda):
* ``C:\PathToAnaconda3\condabin\conda.bat activate base``
* ``python -m pip install windows-curses``
* https://github.com/zephyrproject-rtos/windows-curses
* drawille package is used to draw with braille characters (dottet and quasi-
line charts). Make sure you use a font with Unicode Braille characters. For
Windows e. g.: NSimSun, MS Gothic.
* Install: ``python -m pip install drawille``
* Windows (Anaconda):
* ``C:\PathToAnaconda3\condabin\conda.bat activate base``
* ``python -m pip install drawille``
* drawblock.py is used to draw with block characters (histogram).
example/tui.py is an example script to build a terminal program.

View File

@@ -32,3 +32,4 @@ Submodules
pylib.helper
pylib.mathematics
pylib.time_of_day
pylib.tui

View File

@@ -0,0 +1,7 @@
pylib.tui module
================
.. automodule:: pylib.tui
:members:
:undoc-members:
:show-inheritance:

View File

@@ -10,16 +10,15 @@
.. moduleauthor:: Daniel Weschke <daniel.weschke@directbox.de>
"""
from mpl_toolkits.mplot3d import Axes3D
assert Axes3D
import pylab
from pylib.data import seq, unique_list
from pylib.function import (
sample_half_open, sample_half_open_seq,
b_spline_basis, b_spline_knots, b_spline_curve_with_knots)
from pylib.helper import timeit
from mpl_toolkits.mplot3d import Axes3D
assert Axes3D
import pylab
def b_spline_basis_functions(knots, pmax=None):
m = len(knots) - 1 # m = 3
@@ -27,7 +26,7 @@ def b_spline_basis_functions(knots, pmax=None):
pmax = m
u = seq(knots[0], knots[-1], (knots[-1]-knots[0])/50)
Nij = [[[b_spline_basis(knots, i, j)(uj) for uj in u] for
i in range(m-j)] for j in range(pmax+1)]
i in range(m-j)] for j in range(pmax+1)]
Nj = [[sum(i) for i in zip(*Nij[:][j])] for j in range(pmax+1)]
return u, Nij, Nj
@@ -180,14 +179,14 @@ def example5():
(52.5444045251438, 42.8799268641912, -0.372905635604393),
(52.7547311828766, 42.9295775362814, -0.373148784408123)]
Uu = (0.0228378692889125,
0.0649893839528174,
0.130414237399236,
0.195679174703882,
0.260898113556269,
0.326065686455556,
0.391167888702703,
0.456323551413636,
0.521155975846261)
0.0649893839528174,
0.130414237399236,
0.195679174703882,
0.260898113556269,
0.326065686455556,
0.391167888702703,
0.456323551413636,
0.521155975846261)
mult = (4, 2, 2, 2, 2, 2, 2, 2, 4)
U = [Uu[i] for i in range(len(Uu)) for j in range(mult[i])]
@@ -205,9 +204,9 @@ def example5():
C = b_spline_curve_with_knots(p, P, U)
Cu = sample_half_open(C, U[0], U[-1])
plot_b_spline_curve_with_knots(
Cu = Cu,
CU = sample_half_open_seq(C, Uu) if knots_cp else None,
P = P if knots_cp else None,
Cu=Cu,
CU=sample_half_open_seq(C, Uu) if knots_cp else None,
P=P if knots_cp else None,
figure_id='N5 C')
pylab.gca().set_zlim3d([-1, 0])
@@ -239,14 +238,14 @@ def example6():
(52.5444045251438, 42.8799268641912, -0.372905635604393),
(52.7547311828766, 42.9295775362814, -0.373148784408123)]
Uu = (0.0228378692889125,
0.0649893839528174,
0.130414237399236,
0.195679174703882,
0.260898113556269,
0.326065686455556,
0.391167888702703,
0.456323551413636,
0.521155975846261)
0.0649893839528174,
0.130414237399236,
0.195679174703882,
0.260898113556269,
0.326065686455556,
0.391167888702703,
0.456323551413636,
0.521155975846261)
mult = (4, 2, 2, 2, 2, 2, 2, 2, 4)
U = [Uu[i] for i in range(len(Uu)) for j in range(mult[i])]
@@ -275,86 +274,86 @@ def example6():
def example7():
P = [(-69.99999999999, 6.23746531921, 119.99999999999),
(-69.99999999999, 5.72567326271, 120.0),
(-70.0, 5.2192123782, 120.0),
(-70.0, 4.718082665681, 120.0),
(-70.0, 4.222284125153, 120.0),
(-70.0, 3.731816756617, 120.0),
(-70.0, 3.246680560071, 120.0),
(-70.0, 2.766875535516, 120.0),
(-70.0, 2.292401682953, 120.0),
(-70.0, 1.82325900238, 120.0),
(-70.0, 1.359447493799, 120.0),
(-70.0, 0.900967157208, 120.0),
(-70.0, 0.447817992609, 120.0),
(-69.99999999999, -1.642767914458, 119.99999999999),
(-69.95823302652, -3.284128624962, 119.96005936915),
(-69.87482030195, -4.920567121601, 119.88028704462),
(-69.7502001661, -6.548567099244, 119.76113869291),
(-69.58513326705, -8.164660004507, 119.60341679526),
(-69.38069590753, -9.765475979336, 119.40825949383),
(-69.13826152984, -11.34779669959, 119.17711816806),
(-68.85947036564, -12.90861011093, 118.91172378914),
(-68.54618721656, -14.44516705927, 118.61404198996),
(-68.20044740283, -15.95503981856, 118.28621691953),
(-67.82439084537, -17.43618251348, 117.93050381741),
(-67.42018430873, -18.88699343893, 117.54919035943),
(-66.38758251206, -22.29350540161, 116.57795367665),
(-65.73413448053, -24.21919416036, 115.96554908806),
(-65.03556391343, -26.07956263873, 115.31370192302),
(-64.29648522575, -27.87744521951, 114.62724902124),
(-63.52042791056, -29.61397650413, 113.91024118834),
(-62.71277001846, -31.2871331673, 113.16847249966),
(-61.87901674025, -32.89613508726, 112.4077395496),
(-61.02226890253, -34.44424317029, 111.63151855295),
(-60.14386048877, -35.93622309031, 110.841629897),
(-59.24623340527, -37.37387103089, 110.04091803203),
(-58.33313678246, -38.756819007, 109.23340236149),
(-57.40516397009, -40.08965381341, 108.42014822445),
(-55.01642244455, -43.34968716212, 106.34685334397),
(-53.53813210335, -45.21002358427, 105.08230356996),
(-52.03458081272, -46.96355473328, 103.81650090025),
(-50.50977333246, -48.61777575741, 102.55504546095),
(-48.96692322622, -50.17949288551, 101.30260097008),
(-47.40801072014, -51.65517742458, 100.06277532323),
(-45.83395649691, -53.05076391735, 98.838417665337),
(-44.24537288755, -54.37123987567, 97.632189028576),
(-42.64319994423, -55.62048722024, 96.446976549361),
(-41.02853017217, -56.80167054344, 95.285780596074),
(-39.40157208613, -57.91802439479, 94.15110945761),
(-37.76099941739, -58.97317114245, 93.044667943398),
(-33.51657488475, -61.52870256173, 90.285109332808),
(-30.89322834847, -62.94313830978, 88.677041723595),
(-28.23238814008, -64.22251443102, 87.15321189152),
(-25.55002271787, -65.36600940426, 85.732620462342),
(-22.80465037824, -66.39367032451, 84.407541386373),
(-20.07652968241, -67.27260606721, 83.231827543651),
(-17.27816204332, -68.0519427367, 82.167075623263),
(-14.44812618974, -68.69718956814, 81.25538726298),
(-11.58521735637, -69.2186257426, 80.51004437835),
(-8.697808521544, -69.60868640648, 79.943540692506),
(-5.807821595725, -69.86923851767, 79.563401742733),
(-2.906442029202, -70.00000000001, 79.372539331945),
(0.372271370757, -69.99999999999, 79.372539331937),
(0.762465017147, -69.99999999999, 79.372539331936),
(1.17058093917, -69.99999999999, 79.372539331935),
(1.596619136825, -69.99999999999, 79.372539331934),
(2.040579610114, -69.99999999999, 79.372539331932),
(2.502462359036, -69.99999999999, 79.372539331931),
(2.982267383591, -69.99999999998, 79.37253933193),
(3.479994683778, -69.99999999998, 79.372539331929),
(3.995644259599, -69.99999999998, 79.372539331927),
(4.529216111052, -69.99999999998, 79.372539331926),
(5.080710238139, -69.99999999998, 79.372539331925),
(5.650126640858, -69.99999999997, 79.372539331923),
(6.23746531921, -69.99999999997, 79.372539331922)]
(-69.99999999999, 5.72567326271, 120.0),
(-70.0, 5.2192123782, 120.0),
(-70.0, 4.718082665681, 120.0),
(-70.0, 4.222284125153, 120.0),
(-70.0, 3.731816756617, 120.0),
(-70.0, 3.246680560071, 120.0),
(-70.0, 2.766875535516, 120.0),
(-70.0, 2.292401682953, 120.0),
(-70.0, 1.82325900238, 120.0),
(-70.0, 1.359447493799, 120.0),
(-70.0, 0.900967157208, 120.0),
(-70.0, 0.447817992609, 120.0),
(-69.99999999999, -1.642767914458, 119.99999999999),
(-69.95823302652, -3.284128624962, 119.96005936915),
(-69.87482030195, -4.920567121601, 119.88028704462),
(-69.7502001661, -6.548567099244, 119.76113869291),
(-69.58513326705, -8.164660004507, 119.60341679526),
(-69.38069590753, -9.765475979336, 119.40825949383),
(-69.13826152984, -11.34779669959, 119.17711816806),
(-68.85947036564, -12.90861011093, 118.91172378914),
(-68.54618721656, -14.44516705927, 118.61404198996),
(-68.20044740283, -15.95503981856, 118.28621691953),
(-67.82439084537, -17.43618251348, 117.93050381741),
(-67.42018430873, -18.88699343893, 117.54919035943),
(-66.38758251206, -22.29350540161, 116.57795367665),
(-65.73413448053, -24.21919416036, 115.96554908806),
(-65.03556391343, -26.07956263873, 115.31370192302),
(-64.29648522575, -27.87744521951, 114.62724902124),
(-63.52042791056, -29.61397650413, 113.91024118834),
(-62.71277001846, -31.2871331673, 113.16847249966),
(-61.87901674025, -32.89613508726, 112.4077395496),
(-61.02226890253, -34.44424317029, 111.63151855295),
(-60.14386048877, -35.93622309031, 110.841629897),
(-59.24623340527, -37.37387103089, 110.04091803203),
(-58.33313678246, -38.756819007, 109.23340236149),
(-57.40516397009, -40.08965381341, 108.42014822445),
(-55.01642244455, -43.34968716212, 106.34685334397),
(-53.53813210335, -45.21002358427, 105.08230356996),
(-52.03458081272, -46.96355473328, 103.81650090025),
(-50.50977333246, -48.61777575741, 102.55504546095),
(-48.96692322622, -50.17949288551, 101.30260097008),
(-47.40801072014, -51.65517742458, 100.06277532323),
(-45.83395649691, -53.05076391735, 98.838417665337),
(-44.24537288755, -54.37123987567, 97.632189028576),
(-42.64319994423, -55.62048722024, 96.446976549361),
(-41.02853017217, -56.80167054344, 95.285780596074),
(-39.40157208613, -57.91802439479, 94.15110945761),
(-37.76099941739, -58.97317114245, 93.044667943398),
(-33.51657488475, -61.52870256173, 90.285109332808),
(-30.89322834847, -62.94313830978, 88.677041723595),
(-28.23238814008, -64.22251443102, 87.15321189152),
(-25.55002271787, -65.36600940426, 85.732620462342),
(-22.80465037824, -66.39367032451, 84.407541386373),
(-20.07652968241, -67.27260606721, 83.231827543651),
(-17.27816204332, -68.0519427367, 82.167075623263),
(-14.44812618974, -68.69718956814, 81.25538726298),
(-11.58521735637, -69.2186257426, 80.51004437835),
(-8.697808521544, -69.60868640648, 79.943540692506),
(-5.807821595725, -69.86923851767, 79.563401742733),
(-2.906442029202, -70.00000000001, 79.372539331945),
(0.372271370757, -69.99999999999, 79.372539331937),
(0.762465017147, -69.99999999999, 79.372539331936),
(1.17058093917, -69.99999999999, 79.372539331935),
(1.596619136825, -69.99999999999, 79.372539331934),
(2.040579610114, -69.99999999999, 79.372539331932),
(2.502462359036, -69.99999999999, 79.372539331931),
(2.982267383591, -69.99999999998, 79.37253933193),
(3.479994683778, -69.99999999998, 79.372539331929),
(3.995644259599, -69.99999999998, 79.372539331927),
(4.529216111052, -69.99999999998, 79.372539331926),
(5.080710238139, -69.99999999998, 79.372539331925),
(5.650126640858, -69.99999999997, 79.372539331923),
(6.23746531921, -69.99999999997, 79.372539331922)]
Uu = (-3.932977778518,
1.445001333941e-14,
14.427668850884,
34.626262491172,
65.717581403178,
114.40570375563,
120.64191760942)
1.445001333941e-14,
14.427668850884,
34.626262491172,
65.717581403178,
114.40570375563,
120.64191760942)
mult = (14, 12, 12, 12, 12, 12, 14)
U = [Uu[i] for i in range(len(Uu)) for j in range(mult[i])]
@@ -376,3 +375,4 @@ def example7():
if __name__ == "__main__":
example7()
pylab.show()

193
examples/tui.py Executable file
View File

@@ -0,0 +1,193 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""Example tui.
:Date: 2020-01-12
.. module:: tui
:platform: *nix, Windows
:synopsis: Example tui.
.. moduleauthor:: Daniel Weschke <daniel.weschke@directbox.de>
"""
import curses
import locale
from pylib.data import seq
from pylib.function import sine_wave, cosine_wave, hypotrochoid, to_str
from pylib.tui import TUI
locale.setlocale(locale.LC_ALL, '')
CODE = locale.getpreferredencoding()
def standard_text(window):
window.text(
"1 - Show test page\n" +
"2 - Show Hypotrochoid example\n" +
"h - Show help page\n" +
"q - Exit", 1, 2)
def help_text(window, tui, str_width_height):
screen_height, screen_width = window.getmaxyx()
last_screen_row = screen_height - 1
tui.color_table() # print colors
window.text("screen width and height", 1, last_screen_row-3)
window.text("\u2502", 3, last_screen_row-2) # \u2502
window.text("\u2502", 3, last_screen_row-1) # \u2193 v
window.text("last pressed key as Unicode code point", len(str_width_height)+2, last_screen_row-2)
window.text("\u2502", 1+len(str_width_height)+1, last_screen_row-1)
num_reloads = "number of screen reloads\u256e"
# screen_width-1-len(num_reloads.encode('utf-16'))//2
window.text(num_reloads, screen_width-1-len(num_reloads), last_screen_row-1)
def test_text(window):
window.text("Test page", 1, 2)
def full_text(window, t):
#window.clear()
screen_height, screen_width = window.getmaxyx()
# Sine
f = sine_wave(A=0.5, k=0.1, D=0.5)
frame = to_str(f, x_0=0, x_1=1, h=screen_height-2, w=screen_width, t=t)
# Turtle
import drawille
turtle = drawille.Turtle()
for _ in range(36):
turtle.right(10 + t)
for _ in range(0, 36):
turtle.right(10)
turtle.forward(8)
frame = turtle.frame()
# size for forward 1: width 11+1, height 6
# size for forward 2: width 23+1, height 12
# size for forward 5: width 57+1, height 30
# size for forward 6: width 69+1, height 36
# size for forward 10: width 114+1, height 58
# n 12*n 6*n
# Hypotrochoid
demo = 2
c = drawille.Canvas()
R = 20
r = 6
d = 30
if demo == 1:
r = int(t/50)%19+1
x, y, theta = hypotrochoid(R, r, d)
for i in seq(0, theta[1]*0.98, theta[1]/10000):
c.set(x(i+t), y(i+t))
a = R+d+1 # R-r+d+1
frame = c.frame(min_x=-a, max_x=a, min_y=-a, max_y=a)
if demo == 2:
d = int(t)%21
x, y, theta = hypotrochoid(R, r, d)
for i in seq(0, theta[1]*0.98, theta[1]/5000):
c.set(x(i+t), y(i+t))
a = 2*R # R-r+d+1
frame = c.frame(min_x=-a, max_x=a, min_y=-a, max_y=a)
window.text(frame, padding_top=1, color_pair=10)
window.text("R=%2s r=%2s d=%2s" % (R, r, d), 1, int(a/2)+2)
def win_charts_line(window, f_list, x_0, x_1, w, t, color_pairs, densities):
win_chart_line, _ = window.textbox(height=8, width=52, y=9, x=5, borders=True)
# width 100 pixel / 2 pixels/column = 50 columns
for f, color_pair, density in zip(f_list, color_pairs, densities):
frame = to_str(f, x_0=x_0, x_1=x_1, h=6, w=w, t=t, density=density)
win_chart_line.text(frame, color_pair=color_pair)
def win_chart_histogram(window, f, x_0, x_1, w, t):
newwin2, _ = window.textbox(height=4, width=52, y=9+8, x=5, borders=True)
#frame2 = function_frame(f, x_0=x_0, x_1=x_1, h=2, w=w, t=t, char_set="histogram")
frame2 = to_str(f, x_0=x_0, x_1=x_1, h=2, w=w, t=t, char_set="histogram")
newwin2.text(frame2, color_pair=3)
frame3 = to_str(f, x_0=x_0, x_1=x_1, h=2, w=w, t=t, density=0.5, char_set="histogram")
newwin2.text(frame3, color_pair=4)
def main(delay=1):
"""
no window change for mouse events and resize events.
"""
tui = TUI(delay)
initscr = tui.initscr
try:
tui.last_pressed_ch = 0 # getch() Note that the integer returned does not have to be in ASCII range: function keys, keypad keys and so on return numbers higher than 256.
tui.last_pressed_mouse_ch = 0
i = 1
while True:
tui.clear()
screen_height, screen_width = initscr.getmaxyx()
str_width_height = str(screen_width) + 'x' + str(screen_height) # width and height of the screen
footer_left = [str_width_height, str(tui.last_pressed_ch)] # and last pressed key as char integer ( Unicode code point)
i += 1 # number of screen reloads
initscr.border("Python curses in action!", footer_left, str(i))
if tui.last_pressed_ch == ord('1'):
test_text(initscr)
elif tui.last_pressed_ch == ord('2'):
full_text(initscr, i)
elif tui.last_pressed_ch == ord('h'):
help_text(initscr, tui, str_width_height)
elif tui.last_pressed_ch == ord('q'):
break
else:
standard_text(initscr)
x_0 = 0
x_1 = 1 # TODO
w = 50
t = i/100
# define function normed to the range of [0, 1]
y_1 = sine_wave(A=.5, k=.1, D=.5)
y_1_2 = sine_wave(A=.5, k=.1, f=1+1/3, phi=30, D=.5, degree=True)
y_1_3 = sine_wave(A=.5, k=.1, f=1+2/3, phi=60, D=.5, degree=True)
y_2 = cosine_wave(A=.5, k=.1, f=2, D=.5)
win_charts_line(initscr, [y_1, y_1_2, y_1_3, y_2], x_0, x_1, w, t, [209, 215, 221, 227], [5, 5, 5, 5])
#win_charts_line(initscr, [y_1, y_1_2, y_1_3, y_2], x_0, x_1, w, t, [10, 7, 7, 7], [5, 1, 1, 1])
#y_2 = cosine_wave(A=0.5, k=0.2, f=2, D=0.5)
#win_charts_line(initscr, [y_1, y_2], x_0, x_1, w, t, [10, 7], [5, 1])
win_chart_histogram(initscr, y_1, x_0, x_1, w, t)
# mouse event has occurred
if tui.last_pressed_mouse_ch == curses.KEY_MOUSE:
try:
_, mx, my, _, _ = curses.getmouse()
initscr.text("Mouse pos " + str(mx) + " " + str(my), 1, 6)
initscr.text(initscr.instr(my, mx, 5), mx, my, color_pair=5)
except curses.error:
pass
# std content
# cursor position (last addstr is cursor position)
if tui.cursor_visibility > 0:
initscr.text("", 1, 6)
tui.refresh() # update the screen
tui.getch()
except Exception as e:
import traceback
print('\n'.join(traceback.format_exception(*sys.exc_info())))
finally:
tui.end()
if __name__ == '__main__':
import sys
if len(sys.argv) > 1:
main(sys.argv[1])
else:
main()

View File

@@ -6,7 +6,8 @@ project_dir = os.path.abspath(os.path.dirname(__file__))
parent_dir = os.path.dirname(project_dir)
vendor_dir = os.path.join(parent_dir, 'vendor')
sys.path.append(vendor_dir)
if vendor_dir not in sys.path:
sys.path.append(vendor_dir)
# Now you can import any library located in the "vendor" folder!
# import drawille

View File

@@ -145,7 +145,37 @@ def cad_wireframe(world, centering=True):
plot_post(ax)
def press(event, world, lps):
# 'rotate: ←left, right, up, down, ctrl+left, ctrl+right\n' +
# 'pan: shift+left, shift+right, shift+up, shift+down\n' +
# 'zoom: ctrl+up, ctrl+down\n' +
# 'view: f (front), l (left), r (right), t (top), b (bottom)\n' +
# ' i (isometric), d (dimetric)',
h_open = pylab.text(
0+.01, 1-.015,
'rotate: [←], [→], [↑], [↓], [Ctrl][←], [Ctrl][→]\n' +
'pan: [Shift][←], [Shift][→], [Shift][↑], [Shift][↓]\n' +
'zoom: [Ctrl][↑], [Ctrl][↓]\n' +
'view: [f]ront, [l]eft, [r]ight, [t]op, [b]ottom\n' +
' [i]sometric, [d]imetric',
color='#2280c0',
horizontalalignment='left',
verticalalignment='top',
transform=fig.transFigure,
bbox=dict(facecolor='black', edgecolor='#196090', alpha=0.5),
family='monospace'
)
h_close = pylab.text(
0+.01, 1-.015, '[h]elp',
color='#2280c0',
horizontalalignment='left',
verticalalignment='top',
transform=fig.transFigure,
bbox=dict(facecolor='black', edgecolor='#196090', alpha=0.5),
family='monospace',
visible=False
)
def press(event, world, lps, h_open, h_close):
#print('key pressed:', event.key)
#sys.stdout.flush()
if event.key in [
@@ -215,6 +245,10 @@ def cad_wireframe(world, centering=True):
world.scale(0.9)
for i, j in zip(lps, world.wireframes_xy()):
i.set_data(j)
if event.key == 'h':
visible = h_open.get_visible()
h_open.set_visible(not visible)
h_close.set_visible(visible)
fig.canvas.draw()
def onresize(event, w):
@@ -223,26 +257,8 @@ def cad_wireframe(world, centering=True):
pylab.ylim((-r, r))
fig.canvas.mpl_connect('key_press_event',
lambda event: press(event, world, lps))
lambda event: press(event, world, lps,
h_open, h_close))
fig.canvas.mpl_connect('resize_event',
lambda event: onresize(event, world))
# 'rotate: ←left, right, up, down, ctrl+left, ctrl+right\n' +
# 'pan: shift+left, shift+right, shift+up, shift+down\n' +
# 'zoom: ctrl+up, ctrl+down\n' +
# 'view: f (front), l (left), r (right), t (top), b (bottom)\n' +
# ' i (isometric), d (dimetric)',
pylab.text(
0+.01, 1-.015,
'rotate: [←], [→], [↑], [↓], [Ctrl][←], [Ctrl][→]\n' +
'pan: [Shift][←], [Shift][→], [Shift][↑], [Shift][↓]\n' +
'zoom: [Ctrl][↑], [Ctrl][↓]\n' +
'view: [f]ront, [l]eft, [r]ight, [t]op, [b]ottom\n' +
' [i]sometric, [d]imetric',
horizontalalignment='left',
verticalalignment='top',
transform=fig.transFigure,
bbox=dict(facecolor='black', alpha=0.5),
family='monospace'
)
pylab.show()

View File

@@ -10,6 +10,7 @@
.. moduleauthor:: Daniel Weschke <daniel.weschke@directbox.de>
"""
import os
import time
from contextlib import ContextDecorator
@@ -46,3 +47,43 @@ class timeit(ContextDecorator):
elapsed_time_ms = (time.time() - self.start_time) * 1000
print('{:s} took {:.3f} ms'.format(self.description, elapsed_time_ms))
return False
class cd:
"""Context manager for changing the current working directory
:param new_path: the directory to change into
:type new_path: string
:Example:
::
# enter the directory and run some code:
with cd("~/tmp"):
# we are now in ~/tmp
# code
# outside the context manager we are back where we started.
"""
def __init__(self, new_path):
self.new_path = os.path.expanduser(new_path)
def __enter__(self):
self.saved_path = os.getcwd()
os.chdir(self.new_path)
def __exit__(self, etype, value, traceback):
os.chdir(self.saved_path)
def run_file(file_name):
"""Run a file.
Inside a pythin interpreter it changes to the directory of the
file and after excuting the file it changes back to the working
directory before.
:param file_name: the file to execute
:type file_name: string
"""
workdir = os.path.dirname(os.path.abspath(file_name))
with cd(workdir):
exec(open(file_name).read())

View File

@@ -633,7 +633,7 @@ class matrix(list):
"""
def __getitem__(self, index):
"""
r"""
For index return value, for range return new vector object.
:Example:
@@ -790,7 +790,7 @@ class matrix(list):
:Example:
>>> m = matrix.zeros(3, 3)
>>> print(m)\
>>> print(m)
[[0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0]]
"""
return matrix([[0. for i in range(n)] for j in range(m)])

360
pylib/tui.py Normal file
View File

@@ -0,0 +1,360 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""TUI module.
:Date: 2020-01-10
.. module:: tui
:platform: *nix, Windows
:synopsis: TUI module.
.. moduleauthor:: Daniel Weschke <daniel.weschke@directbox.de>
"""
# TODO: two classes to distinguish between curses (main tui) and
# window (to handle sub windows)?
# TODO: width resizing, min width now 6 because of text and border
# TODO: height resizing, min height
import sys
import curses
def newwin(height, width, y, x):
win = Window()
win.window = curses.newwin(height, width, y, x)
return win
class StdOutWrapper:
"""Send print to stdout (print to the standard console).
usage:
::
# catch all prints into StdOutWrapper
mystdout = StdOutWrapper()
sys.stdout = mystdout
sys.stderr = mystdout
# begin curses (curses.initscr())
# do your stuff here
# print("foo")
# you can also output mystdout.get_text() in a ncurses widget in
# runtime
# end curses (curses.endwin())
# go back to normal state and print all catched prints to stdout
sys.stdout = sys.__stdout__
sys.stderr = sys.__stderr__
sys.stdout.write(mystdout.get_text())
source:
https://stackoverflow.com/a/14010948
"""
text = ""
def write(self, txt):
self.text += txt
self.text = '\n'.join(self.text.split('\n')[-30:])
def get_text(self):
return '\n'.join(self.text.split('\n'))
#def get_text(self,beg,end):
# return '\n'.join(self.text.split('\n')[beg:end])
class TUI:
"""TUI text-based user interface
initscr is the encapsulation window object of the stdscr
stdsc is the curses.initscr
"""
def __init__(self, delay=5):
"""
:param delay: sets the curses.halfdelay, value between 1 and 255.
:param type: int
"""
if not isinstance(delay, int):
try:
delay = int(delay)
except ValueError:
print("TUI(delay)")
print("Could not convert the argument to an integer.")
# catch all prints into StdOutWrapper
self.stdout = StdOutWrapper()
sys.stdout = self.stdout
sys.stderr = self.stdout
# Define the appearance of some interface elements
hotkey_attr = curses.A_BOLD | curses.A_UNDERLINE
menu_attr = curses.A_NORMAL
self.initscr = Window()
self.initscr.initscr()
self.stdscr = self.initscr.window
#print(type(self.stdscr))
#print(type(self.initscr))
try:
curses.cbreak()
curses.halfdelay(delay) # How many tenths of a second are waited, from 1 to 255
#stdscr.nodelay(1)
curses.noecho()
self.cursor_visibility = 0 # Set the cursor state. visibility can be set to 0, 1, or 2, for invisible, normal, or very visible.
curses.curs_set(self.cursor_visibility)
self.stdscr.keypad(1)
curses.mousemask(1) # activate mouse events
# init colors
if curses.has_colors():
curses.start_color() # initializes 8 basic colors. 0:black, 1:red, 2:green, 3:yellow, 4:blue, 5:magenta, 6:cyan, and 7:white.
curses.use_default_colors()
for i in range(0, curses.COLORS):
curses.init_pair(i + 1, i, -1) # Color pair 0 is hard-wired to white on black, and cannot be changed.
except: pass
self.last_pressed_ch = 0 # getch() Note that the integer returned does not have to be in ASCII range: function keys, keypad keys and so on return numbers higher than 256.
self.last_pressed_mouse_ch = 0
def refresh(self):
self.initscr.refresh() # update the screen
def getch(self):
# keep last key value
last_pressed_ch_current = self.initscr.getch()
if last_pressed_ch_current != curses.ERR:
# keep last key while window resizing
if last_pressed_ch_current == curses.KEY_MOUSE:
self.last_pressed_mouse_ch = last_pressed_ch_current
if last_pressed_ch_current in [curses.KEY_MOUSE, curses.KEY_RESIZE]:
pass
else:
self.last_pressed_ch = last_pressed_ch_current
def color_table(self, window=None):
"""Print all available colors with default background.
Check if curses.has_colors() is True.
"""
# TODO: position
# FIXME: use own text method?
# FIXME: build full str first and then print?
if not curses.has_colors():
return
if window is None:
window = self.stdscr
window.addstr(2, 1, '{0} colors available'.format(curses.COLORS))
if curses.can_change_color():
window.addstr(' (can change color: {0})'.format(curses.can_change_color()))
_, maxx = window.getmaxyx()
step_size = 4
maxx = maxx - maxx % step_size
x = 0
y = 3
try:
for i in range(0, curses.COLORS):
window.addstr(y, x, '{0:{1}}'.format(i, step_size), curses.color_pair(i))
x = (x + step_size) % maxx
if x == 0:
y += 1
except:
# End of screen reached
pass
def color_def(self):
if curses.can_change_color(): # if True curses.init_color(color_number, r, g, b) can be used
pass
# changes colors for the terminal also after closing the program.
#curses.color_content(0)
#tmp = curses.color_content(1)
#print(curses.color_content(1))
#curses.init_color(0, 1000, 0, 0) # color_number = init_pair number - 1 (maybe because init_pair number 0 is hard-wired and not changeable)
#curses.init_color(1, 1000, 500, 1000)
#print(curses.color_content(1))
#curses.init_color(1, *tmp)
#print(curses.color_content(1))
def clear(self):
self.stdscr.clear()
def end(self):
"""clean up"""
self.stdscr.clear()
curses.nocbreak()
self.stdscr.keypad(0)
curses.echo()
curses.endwin()
# go back to normal state and print all catched prints to stdout
sys.stdout = sys.__stdout__
sys.stderr = sys.__stderr__
sys.stdout.write(self.stdout.get_text())
class Window:
"""Window
"""
def __init__(self):
self.window = None
def initscr(self):
self.window = curses.initscr()
def derwin(self, height, width, y, x):
win = Window()
win.window = self.window.derwin(height, width, y, x)
return win
def clear(self):
return self.window.clear()
def getmaxyx(self):
return self.window.getmaxyx()
def getch(self):
return self.window.getch()
def instr(self, y, x, n):
return self.window.instr(y, x, n).decode()
def text(self, string, padding_left=0, padding_top=0, attribute=0, color_pair=0):
r"""Test to screen. If multiline than keep the x position for
each new line.
:Example:
::
text(stdscr, 2, 1, "1 - Show test page")
text(stdscr, 3, 1, "h - Show help page")
text(stdscr, 4, 1, "q - Exit")
text(stdscr, 2, 1,
"1 - Show test page\\n" +
"h - Show help page\\n" +
"q - Exit")
.. note::
Writing in the last char of the window (last row bottom and
last column right) is suppressed
"""
win_height, win_width = self.window.getmaxyx()
if win_width-padding_left < 2: # unicode can have 2 char width
return
yi = padding_top
#for row in string.split("\n"):
# window.addnstr(yi, x, row, win_width-x-1, curses.color_pair(9)) # 5
# yi += 1
for row in string.split("\n"): # TODO: os.linesep?
xi = padding_left
for char in row:
# write only inside the window
if not yi >= win_height and not xi >= win_width:
# do not write in the last char of window (last row bottom and last column right)
# unicodes may use multiple chars, this will raise an error for the last char in the window
if yi == win_height-1 and xi >= win_width-1:
break
#if yi == win_height-1 and xi >= win_width-1:
# try:
# char.encode("ascii")
# except UnicodeEncodeError:
# break
# dont add str if empty braille char or simple space character
if char != chr(0x2800) and char != " " and xi < win_width and yi < win_height:
self.window.addstr(yi, xi, char, attribute|curses.color_pair(color_pair))
xi += 1
yi += 1
def border(self, title="", footer_left="", footer_right="", style="horizontal"):
"""Set border around the window with optional title and footer
labels.
:param window: the window to draw a border
:type window: curses.window
:param title: the title for the window (default = "")
:type title: str
:param footer_left: the footer label (default = ""). If footer_left
is a list than every element of the list will be printed sperated
by one column. This is useful to not overwright the border with a
space character.
:type footer_left: str or list
"""
win_height, win_width = self.window.getmaxyx()
if win_width < 3:
return
if isinstance(style, str):
if style == "horizontal":
self.window.border(
' ',
' ',
curses.ACS_HLINE,
curses.ACS_HLINE,
curses.ACS_HLINE,
curses.ACS_HLINE,
curses.ACS_HLINE,
curses.ACS_HLINE,
)
elif style == "full":
self.window.border(0, 0, 0, 0, 0, 0, 0, 0, )
else: # list
self.window.border(*style)
if title:
self.text(title, 1)
if footer_left:
last_win_row = win_height - 1
if isinstance(footer_left, str):
self.text(footer_left, 1, last_win_row)
else: # list
pos = 1
for footer_left_i in footer_left:
self.text(footer_left_i, pos, win_height-1)
pos += len(footer_left_i)+1
if footer_right:
self.text(footer_right, win_width - 1 - len(footer_right), last_win_row)
def textbox(self, height, width, y, x, borders=False):
"""Add sub window.
:param parent_window: the parent window
:type parent_window: curses.window
:param height: the height of the sub window. The reference point of
the sub window is the top left corner.
:type height: int
:param width: the width of the sub window. The reference point of
the sub window is the top left corner.
:type width: int
:param y: the y coordinate (position) of the sub window. Start from
the top.
:type y: int
:param x: the x coordinate (position) of the sub window. Start from
the left.
:returns: the sub window content and decoration
:rtype: (curses.window, curses.window)
"""
# TODO: not to work with two window object but one with the
# possibility to access the derwin(s). Either self.derwins
# or another DoubleWindow class for border and text or do it
# in this class?
screen_height, screen_width = self.window.getmaxyx()
newwin_width = screen_width-x if x+width > screen_width else width
newwin_height = screen_height-y if y+height > screen_height else height
if newwin_width > 0 and newwin_height > 0:
win = self.derwin(newwin_height, newwin_width, y, x)
if borders:
win.border(style="full")
if newwin_width-2 > 0 and newwin_height-1 > 0:
subwin = win.derwin(newwin_height-1, newwin_width-2, 1, 1)
return subwin, win # text and border
return newwin(1, 1, 0, 0), win # only border, no text (top left 1 char)
return win, newwin(1, 1, 0, 0) # only text, no border (top left 1 char)
return newwin(1, 1, 0, 0), newwin(1, 1, 0, 0) # no border and no text (top left 1 char)
def refresh(self):
self.window.refresh()