rename class TUI to App, change StdOutWrapper to a context manager and add idea of a main_loop() for the App class

This commit is contained in:
2020-01-14 08:59:13 +01:00
parent 033cb92dc4
commit d0eabd3252
7 changed files with 186 additions and 145 deletions

View File

@@ -37,7 +37,7 @@
<span class="c1"># -*- coding: utf-8 -*-</span>
<span class="sd">&quot;&quot;&quot;TUI module.</span>
<span class="sd">:Date: 2020-01-10</span>
<span class="sd">:Date: 2020-01-13</span>
<span class="sd">.. module:: tui</span>
<span class="sd"> :platform: *nix, Windows</span>
@@ -62,16 +62,14 @@
<div class="viewcode-block" id="StdOutWrapper"><a class="viewcode-back" href="../../pylib.tui.html#pylib.tui.StdOutWrapper">[docs]</a><span class="k">class</span> <span class="nc">StdOutWrapper</span><span class="p">:</span>
<span class="sd">&quot;&quot;&quot;Send print to stdout (print to the standard console).</span>
<span class="sd"> usage:</span>
<span class="sd"> :Example:</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"> with StdOutWrapper() as mystdout:</span>
<span class="sd"> # begin curses (curses.initscr())</span>
<span class="sd"> # begin curses (curses.initscr(), ...)</span>
<span class="sd"> # do your stuff here</span>
<span class="sd"> # print(&quot;foo&quot;)</span>
@@ -81,24 +79,41 @@
<span class="sd"> # end curses (curses.endwin())</span>
<span class="sd"> # go back to normal state and print all catched prints to stdout</span>
<span class="sd"> sys.stdout = sys.__stdout__</span>
<span class="sd"> sys.stderr = sys.__stderr__</span>
<span class="sd"> sys.stdout.write(mystdout.get_text())</span>
<span class="sd"> source:</span>
<span class="sd"> https://stackoverflow.com/a/14010948</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">text</span> <span class="o">=</span> <span class="s2">&quot;&quot;</span>
<span class="c1"># https://stackoverflow.com/a/14010948</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">text</span> <span class="o">=</span> <span class="s2">&quot;&quot;</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="sd">&quot;&quot;&quot;catch all prints into StdOutWrapper</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="c1">#self.stdout = StdOutWrapper()</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="n">sys</span><span class="o">.</span><span class="n">stderr</span> <span class="o">=</span> <span class="bp">self</span>
<span class="k">return</span> <span class="bp">self</span> <span class="c1"># to use as: with StdOutWrapper() as mystdout:</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="sd">&quot;&quot;&quot;go back to normal state and print all catched prints to</span>
<span class="sd"> stdout</span>
<span class="sd"> &quot;&quot;&quot;</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">get_text</span><span class="p">())</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="sd">&quot;&quot;&quot;print uses write()</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">text</span> <span class="o">+=</span> <span class="n">txt</span>
<span class="bp">self</span><span class="o">.</span><span class="n">text</span> <span class="o">=</span> <span class="s1">&#39;</span><span class="se">\n</span><span class="s1">&#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">text</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">&#39;</span><span class="se">\n</span><span class="s1">&#39;</span><span class="p">)[</span><span class="o">-</span><span class="mi">30</span><span class="p">:])</span></div>
<div class="viewcode-block" id="StdOutWrapper.get_text"><a class="viewcode-back" href="../../pylib.tui.html#pylib.tui.StdOutWrapper.get_text">[docs]</a> <span class="k">def</span> <span class="nf">get_text</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="s1">&#39;</span><span class="se">\n</span><span class="s1">&#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">text</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">&#39;</span><span class="se">\n</span><span class="s1">&#39;</span><span class="p">))</span></div></div>
<span class="c1">#def get_text(self,beg,end):</span>
<span class="c1"># return &#39;\n&#39;.join(self.text.split(&#39;\n&#39;)[beg:end])</span>
<div class="viewcode-block" id="TUI"><a class="viewcode-back" href="../../pylib.tui.html#pylib.tui.TUI">[docs]</a><span class="k">class</span> <span class="nc">TUI</span><span class="p">:</span>
<div class="viewcode-block" id="App"><a class="viewcode-back" href="../../pylib.tui.html#pylib.tui.App">[docs]</a><span class="k">class</span> <span class="nc">App</span><span class="p">:</span>
<span class="sd">&quot;&quot;&quot;TUI text-based user interface</span>
<span class="sd"> initscr is the encapsulation window object of the stdscr</span>
@@ -114,14 +129,9 @@
<span class="k">try</span><span class="p">:</span>
<span class="n">delay</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">delay</span><span class="p">)</span>
<span class="k">except</span> <span class="ne">ValueError</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;TUI(delay)&quot;</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;App(delay)&quot;</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Could not convert the argument to an integer.&quot;</span><span class="p">)</span>
<span class="c1"># catch all prints into StdOutWrapper</span>
<span class="bp">self</span><span class="o">.</span><span class="n">stdout</span> <span class="o">=</span> <span class="n">StdOutWrapper</span><span class="p">()</span>
<span class="n">sys</span><span class="o">.</span><span class="n">stdout</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">stdout</span>
<span class="n">sys</span><span class="o">.</span><span class="n">stderr</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">stdout</span>
<span class="c1"># Define the appearance of some interface elements</span>
<span class="n">hotkey_attr</span> <span class="o">=</span> <span class="n">curses</span><span class="o">.</span><span class="n">A_BOLD</span> <span class="o">|</span> <span class="n">curses</span><span class="o">.</span><span class="n">A_UNDERLINE</span>
<span class="n">menu_attr</span> <span class="o">=</span> <span class="n">curses</span><span class="o">.</span><span class="n">A_NORMAL</span>
@@ -153,10 +163,28 @@
<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>
<div class="viewcode-block" id="App.main_loop"><a class="viewcode-back" href="../../pylib.tui.html#pylib.tui.App.main_loop">[docs]</a> <span class="k">def</span> <span class="nf">main_loop</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">with</span> <span class="n">StdOutWrapper</span><span class="p">():</span>
<span class="k">try</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">&#39;kkkk&#39;</span><span class="p">)</span>
<span class="k">while</span> <span class="kc">True</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">clear</span><span class="p">()</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">&#39;kkkk&#39;</span><span class="p">)</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">last_pressed_ch</span> <span class="o">==</span> <span class="nb">ord</span><span class="p">(</span><span class="s1">&#39;q&#39;</span><span class="p">):</span>
<span class="k">break</span>
<span class="bp">self</span><span class="o">.</span><span class="n">refresh</span><span class="p">()</span> <span class="c1"># update the screen</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">&#39;kkkk&#39;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">getch</span><span class="p">()</span>
<span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="n">e</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">end</span><span class="p">()</span></div>
<div class="viewcode-block" id="App.refresh"><a class="viewcode-back" href="../../pylib.tui.html#pylib.tui.App.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>
<div class="viewcode-block" id="App.getch"><a class="viewcode-back" href="../../pylib.tui.html#pylib.tui.App.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>
@@ -168,7 +196,7 @@
<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>
<div class="viewcode-block" id="App.color_table"><a class="viewcode-back" href="../../pylib.tui.html#pylib.tui.App.color_table">[docs]</a> <span class="k">def</span> <span class="nf">color_table</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">window</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Print all available colors with default background.</span>
<span class="sd"> Check if curses.has_colors() is True.</span>
<span class="sd"> &quot;&quot;&quot;</span>
@@ -198,7 +226,7 @@
<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>
<div class="viewcode-block" id="App.color_def"><a class="viewcode-back" href="../../pylib.tui.html#pylib.tui.App.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>
@@ -211,21 +239,16 @@
<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>
<div class="viewcode-block" id="App.clear"><a class="viewcode-back" href="../../pylib.tui.html#pylib.tui.App.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>
<div class="viewcode-block" id="App.end"><a class="viewcode-back" href="../../pylib.tui.html#pylib.tui.App.end">[docs]</a> <span class="k">def</span> <span class="nf">end</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;clean up&quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">stdscr</span><span class="o">.</span><span class="n">clear</span><span class="p">()</span>
<span class="n">curses</span><span class="o">.</span><span class="n">nocbreak</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">stdscr</span><span class="o">.</span><span class="n">keypad</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>
<span class="n">curses</span><span class="o">.</span><span class="n">echo</span><span class="p">()</span>
<span class="n">curses</span><span class="o">.</span><span class="n">endwin</span><span class="p">()</span>
<span class="c1"># go back to normal state and print all catched prints to stdout</span>
<span class="n">sys</span><span class="o">.</span><span class="n">stdout</span> <span class="o">=</span> <span class="n">sys</span><span class="o">.</span><span class="n">__stdout__</span>
<span class="n">sys</span><span class="o">.</span><span class="n">stderr</span> <span class="o">=</span> <span class="n">sys</span><span class="o">.</span><span class="n">__stderr__</span>
<span class="n">sys</span><span class="o">.</span><span class="n">stdout</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">stdout</span><span class="o">.</span><span class="n">get_text</span><span class="p">())</span></div></div>
<span class="n">curses</span><span class="o">.</span><span class="n">endwin</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>

View File

@@ -152,12 +152,14 @@
</li>
<li><a href="pylib.geometry2d.html#pylib.geometry2d.angle">angle() (in module pylib.geometry2d)</a>
</li>
<li><a href="pylib.data_step.html#pylib.data_step.arc_circle_geometry">arc_circle_geometry() (in module pylib.data_step)</a>
<li><a href="pylib.tui.html#pylib.tui.App">App (class in pylib.tui)</a>
</li>
<li><a href="pylib.geometry.html#pylib.geometry.ArcBSplineCurveWithKnots">ArcBSplineCurveWithKnots (class in pylib.geometry)</a>
<li><a href="pylib.data_step.html#pylib.data_step.arc_circle_geometry">arc_circle_geometry() (in module pylib.data_step)</a>
</li>
</ul></td>
<td style="width: 33%; vertical-align: top;"><ul>
<li><a href="pylib.geometry.html#pylib.geometry.ArcBSplineCurveWithKnots">ArcBSplineCurveWithKnots (class in pylib.geometry)</a>
</li>
<li><a href="pylib.geometry.html#pylib.geometry.ArcCircle">ArcCircle (class in pylib.geometry)</a>
</li>
<li><a href="pylib.geometry.html#pylib.geometry.ArcEllipse">ArcEllipse (class in pylib.geometry)</a>
@@ -234,7 +236,7 @@
</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>
<li><a href="pylib.tui.html#pylib.tui.App.clear">clear() (App method)</a>
<ul>
<li><a href="pylib.tui.html#pylib.tui.Window.clear">(Window method)</a>
@@ -242,9 +244,9 @@
</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><a href="pylib.tui.html#pylib.tui.App.color_def">color_def() (App method)</a>
</li>
<li><a href="pylib.tui.html#pylib.tui.TUI.color_table">color_table() (TUI method)</a>
<li><a href="pylib.tui.html#pylib.tui.App.color_table">color_table() (App 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>
@@ -346,7 +348,7 @@
</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><a href="pylib.tui.html#pylib.tui.App.end">end() (App method)</a>
</li>
<li><a href="pylib.function.html#pylib.function.epitrochoid">epitrochoid() (in module pylib.function)</a>
</li>
@@ -402,7 +404,7 @@
</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>
<li><a href="pylib.tui.html#pylib.tui.App.getch">getch() (App method)</a>
<ul>
<li><a href="pylib.tui.html#pylib.tui.Window.getch">(Window method)</a>
@@ -494,12 +496,14 @@
<h2 id="M">M</h2>
<table style="width: 100%" class="indextable genindextable"><tr>
<td style="width: 33%; vertical-align: top;"><ul>
<li><a href="pylib.mathematics.html#module-mathematics">mathematics (module)</a>
<li><a href="pylib.tui.html#pylib.tui.App.main_loop">main_loop() (App method)</a>
</li>
<li><a href="pylib.mathematics.html#pylib.mathematics.matrix">matrix (class in pylib.mathematics)</a>
<li><a href="pylib.mathematics.html#module-mathematics">mathematics (module)</a>
</li>
</ul></td>
<td style="width: 33%; vertical-align: top;"><ul>
<li><a href="pylib.mathematics.html#pylib.mathematics.matrix">matrix (class in pylib.mathematics)</a>
</li>
<li><a href="pylib.time_of_day.html#pylib.time_of_day.minutes">minutes() (in module pylib.time_of_day)</a>
</li>
<li><a href="pylib.time_of_day.html#pylib.time_of_day.minutes_norm">minutes_norm() (in module pylib.time_of_day)</a>
@@ -638,7 +642,7 @@
</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>
<li><a href="pylib.tui.html#pylib.tui.App.refresh">refresh() (App method)</a>
<ul>
<li><a href="pylib.tui.html#pylib.tui.Window.refresh">(Window method)</a>
@@ -761,8 +765,6 @@
<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>
@@ -803,8 +805,6 @@
<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>

Binary file not shown.

View File

@@ -38,96 +38,91 @@
<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 class="field-odd"><p>2020-01-13</p>
</dd>
</dl>
<span class="target" id="module-tui"></span><dl class="class">
<dt id="pylib.tui.StdOutWrapper">
<em class="property">class </em><code class="sig-name descname">StdOutWrapper</code><a class="reference internal" href="_modules/pylib/tui.html#StdOutWrapper"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#pylib.tui.StdOutWrapper" title="Permalink to this definition"></a></dt>
<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">object</span></code></p>
<p>Send print to stdout (print to the standard console).</p>
<p>usage:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="c1"># catch all prints into StdOutWrapper</span>
<span class="n">mystdout</span> <span class="o">=</span> <span class="n">StdOutWrapper</span><span class="p">()</span>
<span class="n">sys</span><span class="o">.</span><span class="n">stdout</span> <span class="o">=</span> <span class="n">mystdout</span>
<span class="n">sys</span><span class="o">.</span><span class="n">stderr</span> <span class="o">=</span> <span class="n">mystdout</span>
<span class="c1"># begin curses (curses.initscr())</span>
<span class="c1"># do your stuff here</span>
<span class="c1"># print(&quot;foo&quot;)</span>
<span class="c1"># you can also output mystdout.get_text() in a ncurses widget in</span>
<span class="c1"># runtime</span>
<span class="c1"># end curses (curses.endwin())</span>
<span class="c1"># go back to normal state and print all catched prints to stdout</span>
<span class="n">sys</span><span class="o">.</span><span class="n">stdout</span> <span class="o">=</span> <span class="n">sys</span><span class="o">.</span><span class="n">__stdout__</span>
<span class="n">sys</span><span class="o">.</span><span class="n">stderr</span> <span class="o">=</span> <span class="n">sys</span><span class="o">.</span><span class="n">__stderr__</span>
<span class="n">sys</span><span class="o">.</span><span class="n">stdout</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">mystdout</span><span class="o">.</span><span class="n">get_text</span><span class="p">())</span>
</pre></div>
</div>
<dl class="simple">
<dt>source:</dt><dd><p><a class="reference external" href="https://stackoverflow.com/a/14010948">https://stackoverflow.com/a/14010948</a></p>
</dd>
</dl>
<dl class="method">
<dt id="pylib.tui.StdOutWrapper.get_text">
<code class="sig-name descname">get_text</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="_modules/pylib/tui.html#StdOutWrapper.get_text"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#pylib.tui.StdOutWrapper.get_text" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="attribute">
<dt id="pylib.tui.StdOutWrapper.text">
<code class="sig-name descname">text</code><em class="property"> = ''</em><a class="headerlink" href="#pylib.tui.StdOutWrapper.text" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="method">
<dt id="pylib.tui.StdOutWrapper.write">
<code class="sig-name descname">write</code><span class="sig-paren">(</span><em class="sig-param">txt</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/pylib/tui.html#StdOutWrapper.write"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#pylib.tui.StdOutWrapper.write" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
</dd></dl>
<dl class="class">
<dt id="pylib.tui.TUI">
<em class="property">class </em><code class="sig-name descname">TUI</code><span class="sig-paren">(</span><em class="sig-param">delay=5</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/pylib/tui.html#TUI"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#pylib.tui.TUI" title="Permalink to this definition"></a></dt>
<dt id="pylib.tui.App">
<em class="property">class </em><code class="sig-name descname">App</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#App"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#pylib.tui.App" 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>
<dt id="pylib.tui.App.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#App.clear"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#pylib.tui.App.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>
<dt id="pylib.tui.App.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#App.color_def"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#pylib.tui.App.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>
<dt id="pylib.tui.App.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#App.color_table"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#pylib.tui.App.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>
<dt id="pylib.tui.App.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#App.end"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#pylib.tui.App.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>
<dt id="pylib.tui.App.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#App.getch"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#pylib.tui.App.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>
<dt id="pylib.tui.App.main_loop">
<code class="sig-name descname">main_loop</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="_modules/pylib/tui.html#App.main_loop"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#pylib.tui.App.main_loop" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="method">
<dt id="pylib.tui.App.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#App.refresh"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#pylib.tui.App.refresh" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
</dd></dl>
<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>
<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="c1"># catch all prints into StdOutWrapper</span>
<span class="k">with</span> <span class="n">StdOutWrapper</span><span class="p">()</span> <span class="k">as</span> <span class="n">mystdout</span><span class="p">:</span>
<span class="c1"># begin curses (curses.initscr(), ...)</span>
<span class="c1"># do your stuff here</span>
<span class="c1"># print(&quot;foo&quot;)</span>
<span class="c1"># you can also output mystdout.get_text() in a ncurses widget in</span>
<span class="c1"># runtime</span>
<span class="c1"># end curses (curses.endwin())</span>
<span class="c1"># go back to normal state and print all catched prints to stdout</span>
</pre></div>
</div>
<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="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><p>print uses write()</p>
</dd></dl>
</dd></dl>
<dl class="class">

File diff suppressed because one or more lines are too long

View File

@@ -15,7 +15,7 @@ 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
from pylib.tui import App
locale.setlocale(locale.LC_ALL, '')
CODE = locale.getpreferredencoding()
@@ -115,7 +115,7 @@ def main(delay=1):
"""
no window change for mouse events and resize events.
"""
tui = TUI(delay)
tui = App(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.

View File

@@ -2,7 +2,7 @@
# -*- coding: utf-8 -*-
"""TUI module.
:Date: 2020-01-10
:Date: 2020-01-13
.. module:: tui
:platform: *nix, Windows
@@ -27,16 +27,14 @@ def newwin(height, width, y, x):
class StdOutWrapper:
"""Send print to stdout (print to the standard console).
usage:
:Example:
::
# catch all prints into StdOutWrapper
mystdout = StdOutWrapper()
sys.stdout = mystdout
sys.stderr = mystdout
with StdOutWrapper() as mystdout:
# begin curses (curses.initscr())
# begin curses (curses.initscr(), ...)
# do your stuff here
# print("foo")
@@ -46,24 +44,41 @@ class StdOutWrapper:
# end curses (curses.endwin())
# go back to normal state and print all catched prints to stdout
"""
# https://stackoverflow.com/a/14010948
def __init__(self):
self.text = ""
def __enter__(self):
"""catch all prints into StdOutWrapper
"""
#self.stdout = StdOutWrapper()
sys.stdout = self
sys.stderr = self
return self # to use as: with StdOutWrapper() as mystdout:
def __exit__(self, etype, value, traceback):
"""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())
sys.stdout.write(self.get_text())
source:
https://stackoverflow.com/a/14010948
"""
text = ""
def write(self, txt):
"""print uses write()
"""
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:
class App:
"""TUI text-based user interface
initscr is the encapsulation window object of the stdscr
@@ -79,14 +94,9 @@ class TUI:
try:
delay = int(delay)
except ValueError:
print("TUI(delay)")
print("App(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
@@ -118,6 +128,24 @@ class TUI:
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 main_loop(self):
with StdOutWrapper():
try:
print('kkkk')
while True:
self.clear()
print('kkkk')
if self.last_pressed_ch == ord('q'):
break
self.refresh() # update the screen
print('kkkk')
self.getch()
except Exception as e:
print(e)
self.end()
def refresh(self):
self.initscr.refresh() # update the screen
@@ -187,11 +215,6 @@ class TUI:
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