2from threading
import Event, RLock, Thread
3from types
import TracebackType
4from typing
import IO, Any, Callable, List, Optional, TextIO, Type, cast
6from .
import get_console
7from .console
import Console, ConsoleRenderable, RenderableType, RenderHook
8from .control
import Control
9from .file_proxy
import FileProxy
10from .jupyter
import JupyterMixin
11from .live_render
import LiveRender, VerticalOverflowMethod
12from .screen
import Screen
17 """A thread that calls refresh() at regular intervals."""
19 def __init__(self, live:
"Live", refresh_per_second: float) ->
None:
28 def run(self) -> None:
36 """Renders an auto-updating live display of any given renderable.
39 renderable (RenderableType, optional): The renderable to live display. Defaults to displaying nothing.
40 console (Console, optional): Optional Console instance. Default will an internal Console instance writing to stdout.
41 screen (bool, optional): Enable alternate screen mode. Defaults to False.
42 auto_refresh (bool, optional): Enable auto refresh. If disabled, you will need to call `refresh()` or `update()` with refresh flag. Defaults to True
43 refresh_per_second (float, optional): Number of times per second to refresh the live display. Defaults to 4.
44 transient (bool, optional): Clear the renderable on exit (has no effect when screen=True). Defaults to False.
45 redirect_stdout (bool, optional): Enable redirection of stdout, so ``print`` may be used. Defaults to True.
46 redirect_stderr (bool, optional): Enable redirection of stderr. Defaults to True.
47 vertical_overflow (VerticalOverflowMethod, optional): How to handle renderable when it is too tall for the console. Defaults to "ellipsis".
48 get_renderable (Callable[[], RenderableType], optional): Optional callable to get renderable. Defaults to None.
53 renderable: Optional[RenderableType] =
None,
55 console: Optional[Console] =
None,
57 auto_refresh: bool =
True,
58 refresh_per_second: float = 4,
59 transient: bool =
False,
60 redirect_stdout: bool =
True,
61 redirect_stderr: bool =
True,
62 vertical_overflow: VerticalOverflowMethod =
"ellipsis",
63 get_renderable: Optional[Callable[[], RenderableType]] =
None,
65 assert refresh_per_second > 0,
"refresh_per_second must be > 0"
67 self.
console = console
if console
is not None else get_console()
93 """Check if live display has been started."""
102 return renderable
or ""
104 def start(self, refresh: bool =
False) ->
None:
105 """Start live rendering display.
108 refresh (bool, optional): Also refresh. Defaults to False.
117 self.
console.show_cursor(
False)
119 self.
console.push_render_hook(self)
135 """Stop live rendering display."""
158 self.
console.set_alt_screen(
False)
171 exc_type: Optional[Type[BaseException]],
172 exc_val: Optional[BaseException],
173 exc_tb: Optional[TracebackType],
178 """Enable redirecting of stdout / stderr."""
188 """Disable redirecting of stdout / stderr."""
198 """Get the renderable that is being displayed
201 RenderableType: Displayed renderable.
206 def update(self, renderable: RenderableType, *, refresh: bool =
False) ->
None:
207 """Update the renderable that is being displayed
210 renderable (RenderableType): New renderable to use.
211 refresh (bool, optional): Refresh the display. Defaults to False.
214 renderable = self.
console.render_str(renderable)
221 """Update the display of the Live Render."""
227 from ipywidgets
import Output
240 elif self.
console.is_terminal
and not self.
console.is_dumb_terminal:
250 self, renderables: List[ConsoleRenderable]
251 ) -> List[ConsoleRenderable]:
252 """Process renderables to restore cursor and display progress."""
254 if self.
console.is_interactive:
271if __name__ ==
"__main__":
274 from itertools
import cycle
275 from typing
import Dict, List, Tuple
277 from .align
import Align
278 from .console
import Console
279 from .live
import Live
as Live
280 from .panel
import Panel
281 from .rule
import Rule
282 from .syntax
import Syntax
283 from .table
import Table
288 '''def loop_last(values: Iterable[T]) -> Iterable[Tuple[bool, T]]:
289 """Iterate and generate a tuple with a flag for last value."""
290 iter_values = iter(values)
292 previous_value = next(iter_values)
293 except StopIteration:
295 for value in iter_values:
296 yield False, previous_value
297 previous_value = value
298 yield True, previous_value''',
306 progress_renderables = [
307 "You can make the terminal shorter and taller to see the live table hide"
308 "Text may be printed while the progress bars are rendering.",
309 Panel(
"In fact, [i]any[/i] renderable will work"),
310 "Such as [magenta]tables[/]...",
312 "Pretty printed structures...",
313 {
"type":
"example",
"text":
"Pretty printed"},
316 Rule(
"Give it a try!"),
319 examples = cycle(progress_renderables)
342 with Live(console=console)
as live_table:
343 exchange_rate_dict: Dict[Tuple[str, str], float] = {}
345 for index
in range(100):
346 select_exchange = exchanges[index %
len(exchanges)]
348 for exchange
in exchanges:
349 if exchange == select_exchange:
354 exchange_rate_dict[(select_exchange, exchange)] = 200 / (
357 if len(exchange_rate_dict) >
len(exchanges) - 1:
359 table =
Table(title=
"Exchange Rates")
370 f
"{exchange_rate:.4f}",
371 style=
"red" if exchange_rate < 1.0
else "green",
None __exit__(self, Optional[Type[BaseException]] exc_type, Optional[BaseException] exc_val, Optional[TracebackType] exc_tb)
None _disable_redirect_io(self)
RenderableType get_renderable(self)
List[ConsoleRenderable] process_renderables(self, List[ConsoleRenderable] renderables)
RenderableType renderable(self)
None _enable_redirect_io(self)
None __init__(self, Optional[RenderableType] renderable=None, *Optional[Console] console=None, bool screen=False, bool auto_refresh=True, float refresh_per_second=4, bool transient=False, bool redirect_stdout=True, bool redirect_stderr=True, VerticalOverflowMethod vertical_overflow="ellipsis", Optional[Callable[[], RenderableType]] get_renderable=None)
None start(self, bool refresh=False)
None update(self, RenderableType renderable, *bool refresh=False)
None __init__(self, "Live" live, float refresh_per_second)