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:
1
docs/build/html/_modules/index.html
vendored
1
docs/build/html/_modules/index.html
vendored
@@ -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>
|
||||
|
||||
@@ -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"># 'rotate: ←left, right, up, down, ctrl+left, ctrl+right\n' +</span>
|
||||
<span class="c1"># 'pan: shift+left, shift+right, shift+up, shift+down\n' +</span>
|
||||
<span class="c1"># 'zoom: ctrl+up, ctrl+down\n' +</span>
|
||||
<span class="c1"># 'view: f (front), l (left), r (right), t (top), b (bottom)\n' +</span>
|
||||
<span class="c1"># ' i (isometric), d (dimetric)',</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">'rotate: [←], [→], [↑], [↓], [Ctrl][←], [Ctrl][→]</span><span class="se">\n</span><span class="s1">'</span> <span class="o">+</span>
|
||||
<span class="s1">'pan: [Shift][←], [Shift][→], [Shift][↑], [Shift][↓]</span><span class="se">\n</span><span class="s1">'</span> <span class="o">+</span>
|
||||
<span class="s1">'zoom: [Ctrl][↑], [Ctrl][↓]</span><span class="se">\n</span><span class="s1">'</span> <span class="o">+</span>
|
||||
<span class="s1">'view: [f]ront, [l]eft, [r]ight, [t]op, [b]ottom</span><span class="se">\n</span><span class="s1">'</span> <span class="o">+</span>
|
||||
<span class="s1">' [i]sometric, [d]imetric'</span><span class="p">,</span>
|
||||
<span class="n">color</span><span class="o">=</span><span class="s1">'#2280c0'</span><span class="p">,</span>
|
||||
<span class="n">horizontalalignment</span><span class="o">=</span><span class="s1">'left'</span><span class="p">,</span>
|
||||
<span class="n">verticalalignment</span><span class="o">=</span><span class="s1">'top'</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">'black'</span><span class="p">,</span> <span class="n">edgecolor</span><span class="o">=</span><span class="s1">'#196090'</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">'monospace'</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">'[h]elp'</span><span class="p">,</span>
|
||||
<span class="n">color</span><span class="o">=</span><span class="s1">'#2280c0'</span><span class="p">,</span>
|
||||
<span class="n">horizontalalignment</span><span class="o">=</span><span class="s1">'left'</span><span class="p">,</span>
|
||||
<span class="n">verticalalignment</span><span class="o">=</span><span class="s1">'top'</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">'black'</span><span class="p">,</span> <span class="n">edgecolor</span><span class="o">=</span><span class="s1">'#196090'</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">'monospace'</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('key pressed:', 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">'h'</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">'key_press_event'</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">'resize_event'</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"># 'rotate: ←left, right, up, down, ctrl+left, ctrl+right\n' +</span>
|
||||
<span class="c1"># 'pan: shift+left, shift+right, shift+up, shift+down\n' +</span>
|
||||
<span class="c1"># 'zoom: ctrl+up, ctrl+down\n' +</span>
|
||||
<span class="c1"># 'view: f (front), l (left), r (right), t (top), b (bottom)\n' +</span>
|
||||
<span class="c1"># ' i (isometric), d (dimetric)',</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">'rotate: [←], [→], [↑], [↓], [Ctrl][←], [Ctrl][→]</span><span class="se">\n</span><span class="s1">'</span> <span class="o">+</span>
|
||||
<span class="s1">'pan: [Shift][←], [Shift][→], [Shift][↑], [Shift][↓]</span><span class="se">\n</span><span class="s1">'</span> <span class="o">+</span>
|
||||
<span class="s1">'zoom: [Ctrl][↑], [Ctrl][↓]</span><span class="se">\n</span><span class="s1">'</span> <span class="o">+</span>
|
||||
<span class="s1">'view: [f]ront, [l]eft, [r]ight, [t]op, [b]ottom</span><span class="se">\n</span><span class="s1">'</span> <span class="o">+</span>
|
||||
<span class="s1">' [i]sometric, [d]imetric'</span><span class="p">,</span>
|
||||
<span class="n">horizontalalignment</span><span class="o">=</span><span class="s1">'left'</span><span class="p">,</span>
|
||||
<span class="n">verticalalignment</span><span class="o">=</span><span class="s1">'top'</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">'black'</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">'monospace'</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>
|
||||
|
||||
|
||||
41
docs/build/html/_modules/pylib/helper.html
vendored
41
docs/build/html/_modules/pylib/helper.html
vendored
@@ -45,6 +45,7 @@
|
||||
|
||||
<span class="sd">.. moduleauthor:: Daniel Weschke <daniel.weschke@directbox.de></span>
|
||||
<span class="sd">"""</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">'</span><span class="si">{:s}</span><span class="s1"> took </span><span class="si">{:.3f}</span><span class="s1"> ms'</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">"""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("~/tmp"):</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"> """</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">"""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"> """</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>
|
||||
|
||||
@@ -668,7 +668,7 @@
|
||||
<span class="sd"> """</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">"""</span>
|
||||
<span class="sa">r</span><span class="sd">"""</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"> >>> m = matrix.zeros(3, 3)</span>
|
||||
<span class="sd"> >>> print(m)\</span>
|
||||
<span class="sd"> >>> 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"> """</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
463
docs/build/html/_modules/pylib/tui.html
vendored
Normal file
@@ -0,0 +1,463 @@
|
||||
|
||||
<!DOCTYPE html>
|
||||
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<title>pylib.tui — 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">"""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 <daniel.weschke@directbox.de></span>
|
||||
<span class="sd">"""</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">"""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("foo")</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"> """</span>
|
||||
<span class="n">text</span> <span class="o">=</span> <span class="s2">""</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">'</span><span class="se">\n</span><span class="s1">'</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">'</span><span class="se">\n</span><span class="s1">'</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">'</span><span class="se">\n</span><span class="s1">'</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">'</span><span class="se">\n</span><span class="s1">'</span><span class="p">))</span></div></div>
|
||||
<span class="c1">#def get_text(self,beg,end):</span>
|
||||
<span class="c1"># return '\n'.join(self.text.split('\n')[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">"""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"> """</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">"""</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"> """</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">"TUI(delay)"</span><span class="p">)</span>
|
||||
<span class="nb">print</span><span class="p">(</span><span class="s2">"Could not convert the argument to an integer."</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">"""Print all available colors with default background.</span>
|
||||
<span class="sd"> Check if curses.has_colors() is True.</span>
|
||||
<span class="sd"> """</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">'</span><span class="si">{0}</span><span class="s1"> colors available'</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">' (can change color: </span><span class="si">{0}</span><span class="s1">)'</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">'{0:</span><span class="si">{1}</span><span class="s1">}'</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">"""clean up"""</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">"""Window</span>
|
||||
<span class="sd"> """</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">"""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, "1 - Show test page")</span>
|
||||
<span class="sd"> text(stdscr, 3, 1, "h - Show help page")</span>
|
||||
<span class="sd"> text(stdscr, 4, 1, "q - Exit")</span>
|
||||
|
||||
<span class="sd"> text(stdscr, 2, 1,</span>
|
||||
<span class="sd"> "1 - Show test page\\n" +</span>
|
||||
<span class="sd"> "h - Show help page\\n" +</span>
|
||||
<span class="sd"> "q - Exit")</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"> """</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"><</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("\n"):</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">"</span><span class="se">\n</span><span class="s2">"</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">>=</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">>=</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">>=</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 >= win_width-1:</span>
|
||||
<span class="c1"># try:</span>
|
||||
<span class="c1"># char.encode("ascii")</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">" "</span> <span class="ow">and</span> <span class="n">xi</span> <span class="o"><</span> <span class="n">win_width</span> <span class="ow">and</span> <span class="n">yi</span> <span class="o"><</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">""</span><span class="p">,</span> <span class="n">footer_left</span><span class="o">=</span><span class="s2">""</span><span class="p">,</span> <span class="n">footer_right</span><span class="o">=</span><span class="s2">""</span><span class="p">,</span> <span class="n">style</span><span class="o">=</span><span class="s2">"horizontal"</span><span class="p">):</span>
|
||||
<span class="sd">"""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 = "")</span>
|
||||
<span class="sd"> :type title: str</span>
|
||||
<span class="sd"> :param footer_left: the footer label (default = ""). 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"> """</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="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">"horizontal"</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">' '</span><span class="p">,</span>
|
||||
<span class="s1">' '</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">"full"</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">"""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"> """</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">></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">></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">></span> <span class="mi">0</span> <span class="ow">and</span> <span class="n">newwin_height</span> <span class="o">></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">"full"</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">></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">></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">
|
||||
©2019, Daniel Weschke.
|
||||
|
||||
|
|
||||
Powered by <a href="http://sphinx-doc.org/">Sphinx 2.2.1</a>
|
||||
& <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.12</a>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
|
||||
</body>
|
||||
</html>
|
||||
33
docs/build/html/_sources/index.rst.txt
vendored
33
docs/build/html/_sources/index.rst.txt
vendored
@@ -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.
|
||||
|
||||
1
docs/build/html/_sources/pylib.rst.txt
vendored
1
docs/build/html/_sources/pylib.rst.txt
vendored
@@ -32,3 +32,4 @@ Submodules
|
||||
pylib.helper
|
||||
pylib.mathematics
|
||||
pylib.time_of_day
|
||||
pylib.tui
|
||||
|
||||
7
docs/build/html/_sources/pylib.tui.rst.txt
vendored
Normal file
7
docs/build/html/_sources/pylib.tui.rst.txt
vendored
Normal file
@@ -0,0 +1,7 @@
|
||||
pylib.tui module
|
||||
================
|
||||
|
||||
.. automodule:: pylib.tui
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
78
docs/build/html/genindex.html
vendored
78
docs/build/html/genindex.html
vendored
@@ -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>
|
||||
|
||||
|
||||
38
docs/build/html/index.html
vendored
38
docs/build/html/index.html
vendored
@@ -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>
|
||||
|
||||
|
||||
|
||||
1
docs/build/html/modules.html
vendored
1
docs/build/html/modules.html
vendored
@@ -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>
|
||||
|
||||
BIN
docs/build/html/objects.inv
vendored
BIN
docs/build/html/objects.inv
vendored
Binary file not shown.
10
docs/build/html/py-modindex.html
vendored
10
docs/build/html/py-modindex.html
vendored
@@ -261,6 +261,11 @@
|
||||
<td>   
|
||||
<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>   
|
||||
<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> </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>
|
||||
|
||||
|
||||
|
||||
35
docs/build/html/pylib.helper.html
vendored
35
docs/build/html/pylib.helper.html
vendored
@@ -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">"~/tmp"</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>
|
||||
|
||||
1
docs/build/html/pylib.html
vendored
1
docs/build/html/pylib.html
vendored
@@ -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>
|
||||
|
||||
6
docs/build/html/pylib.mathematics.html
vendored
6
docs/build/html/pylib.mathematics.html
vendored
@@ -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">>>> </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">>>> </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">>>> </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">>>> </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">>>> </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">>>> </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">>>> </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
328
docs/build/html/pylib.tui.html
vendored
Normal file
@@ -0,0 +1,328 @@
|
||||
|
||||
<!DOCTYPE html>
|
||||
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<title>pylib.tui module — 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("foo")</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">"1 - Show test page"</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">"h - Show help page"</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">"q - Exit"</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">"1 - Show test page</span><span class="se">\\</span><span class="s2">n"</span> <span class="o">+</span>
|
||||
<span class="s2">"h - Show help page</span><span class="se">\\</span><span class="s2">n"</span> <span class="o">+</span>
|
||||
<span class="s2">"q - Exit"</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">
|
||||
©2019, Daniel Weschke.
|
||||
|
||||
|
|
||||
Powered by <a href="http://sphinx-doc.org/">Sphinx 2.2.1</a>
|
||||
& <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>
|
||||
2
docs/build/html/searchindex.js
vendored
2
docs/build/html/searchindex.js
vendored
File diff suppressed because one or more lines are too long
@@ -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.
|
||||
|
||||
@@ -32,3 +32,4 @@ Submodules
|
||||
pylib.helper
|
||||
pylib.mathematics
|
||||
pylib.time_of_day
|
||||
pylib.tui
|
||||
|
||||
7
docs/source/pylib.tui.rst
Normal file
7
docs/source/pylib.tui.rst
Normal file
@@ -0,0 +1,7 @@
|
||||
pylib.tui module
|
||||
================
|
||||
|
||||
.. automodule:: pylib.tui
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
@@ -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
|
||||
@@ -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])
|
||||
@@ -376,3 +375,4 @@ def example7():
|
||||
|
||||
if __name__ == "__main__":
|
||||
example7()
|
||||
pylab.show()
|
||||
|
||||
193
examples/tui.py
Executable file
193
examples/tui.py
Executable 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()
|
||||
@@ -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
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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())
|
||||
|
||||
@@ -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
360
pylib/tui.py
Normal 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()
|
||||
Reference in New Issue
Block a user