Source code for etho.utils.tui

import rich
from rich.panel import Panel
from rich.console import Console
from rich.table import Table
from typing import Optional
import pandas as pd
import time


def dict_to_def(d, defaults=None):
    s = ""
    for key, val in d.items():
        s += f"[bold]{key}[/]:\n   {str(val)}"
        if defaults is not None and key in defaults:
            s += f" (target: {str(defaults[key])})"
        s += "\n"
    return s


def dict_to_table(d, title=None, key_name="Key", value_names=None):

    table = Table(title=title)

    table.add_column(key_name, justify="right", style="cyan", no_wrap=True)
    if value_names is None:
        first_key = list(d.keys())[0]
        value_names = [f"Value {cnt}" for cnt, _ in enumerate(d[first_key])]

    for value_name in value_names:
        table.add_column(value_name, justify="left", style="magenta")

    for key, val in d.items():
        table.add_row(key, *[str(v) for v in val])
    return table


[docs] def df_to_table( pandas_dataframe: pd.DataFrame, show_index: bool = True, index_name: Optional[str] = None, ) -> Table: """Convert a pandas.DataFrame obj into a rich.Table obj. Args: pandas_dataframe (DataFrame): A Pandas DataFrame to be converted to a rich Table. show_index (bool): Add a column with a row count to the table. Defaults to True. index_name (str, optional): The column name to give to the index column. Defaults to None, showing no value. Returns: Table: The rich Table instance passed, populated with the DataFrame values.""" rich_table = Table() if show_index: index_name = str(index_name) if index_name else "" rich_table.add_column(index_name) for column in pandas_dataframe.columns: rich_table.add_column(str(column)) for index, value_list in enumerate(pandas_dataframe.values.tolist()): row = [str(index)] if show_index else [] row += [str(x) for x in value_list] rich_table.add_row(*row) return rich_table
def rich_information(info, prefix=""): for key, val in info.items(): if isinstance(val, dict): rich.print(Panel(dict_to_def(val), title=f"{prefix}: {key}")) elif isinstance(val, (list, tuple)): rich.print(Panel(dict_to_def(val[0], defaults=val[1]), title=f"{prefix}: {key}")) elif isinstance(val, pd.DataFrame): rich.print(Panel(df_to_table(val), title=f"{prefix}: {key}")) class CameraProgress: def __init__(self, nbFrames: int): self.prev_t: Optional[float] = None self.prev_n: Optional[int] = None self.console = Console() self.nbFrames = nbFrames self.nDigits = len(str(int(self.nbFrames))) def update(self, number_of_frames: int, payload=None): t = time.time() if self.prev_t is not None: current_frame_interval = (t - self.prev_t) / (number_of_frames - self.prev_n) current_frame_rate = 1 / current_frame_interval prgrs_len = self.console.size.width // 2 - 40 prgrs_cut = round(number_of_frames / (self.nbFrames // prgrs_len)) prgrs = [] for pos in range(prgrs_len): if pos < prgrs_cut: prgrs.append("█") else: prgrs.append("░") progressbar = f"\rCamera: [{''.join(prgrs)}] {int(number_of_frames): {self.nDigits}d}/{self.nbFrames} frames at {current_frame_rate:1.2f} fps " if payload is not None: progressbar += f"{payload}" print(progressbar, end="") self.prev_t = t self.prev_n = number_of_frames