Python rich: Terminal Bonito & Produtivo

Laboratório de Programação — Ciência da Computação • UFPI

Console, estilos, tabelas, painéis, árvores, progresso, live, markdown, syntax, status/spinners e mais — com syntax highlighting

O que é o rich?

  • Biblioteca para renderizar texto com estilo no terminal (cores, negrito, emoji, etc.).
  • Componentes: Console, Table, Panel, Tree, Progress, Live, Markdown, Syntax, Status, Columns, Traceback, Prompt
  • Funciona em Windows, macOS e Linux.
pip install rich

Console & Estilos básicos

from rich.console import Console
console = Console()

console.print("[bold magenta]Olá[/] [green]mundo[/]! :snake:")
console.print("Erros em [bold red]vermelho[/], avisos em [yellow]amarelo[/].")

Markup & Emojis

  • Tags: [bold], [italic], [color], [/].
  • Emojis: :snake:, :rocket:
  • Desabilite markup: Console(markup=False).

Pretty & Inspect

from rich import pretty, inspect
pretty.install()  # ativa formatação bonita do print()
dados = {"curso": "Lab CC", "alunos": ["Ana", "João"], "ativo": True}
print(dados)      # agora colorido e identado
inspect(dados, methods=True)

Regra e Texto alinhado

from rich.console import Console
from rich.rule import Rule
from rich.align import Align

console = Console()
console.print(Rule("[bold blue]Seção 1"))
console.print(Align("Centralizado", align="center"))

Panel (caixa com borda)

from rich.console import Console
from rich.panel import Panel

console = Console()
console.print(Panel.fit(
    "[bold green]Sucesso![/]\nOperação concluída.",
    title="Status", border_style="green"
))

Table (tabelas bonitas)

from rich.console import Console
from rich.table import Table

table = Table(title="Alunos")
table.add_column("Nome", style="cyan", no_wrap=True)
table.add_column("Média", justify="right")
table.add_row("Ana", "9.2")
table.add_row("João", "8.7")

Console().print(table)

Tree (árvores)

from rich.console import Console
from rich.tree import Tree

raiz = Tree("Projeto")
src = raiz.add("[bold]src[/]")
src.add("main.py")
src.add("utils.py")
raiz.add("README.md")

Console().print(raiz)

Columns (múltiplas colunas)

from rich.console import Console
from rich.columns import Columns

itens = [f"[cyan]Item {i}[/]" for i in range(1, 7)]
Console().print(Columns(itens, equal=True, expand=True))

Progress (barras de progresso)

import time
from rich.progress import Progress

with Progress() as progress:
    tarefa = progress.add_task("[green]Baixando...", total=100)
    while not progress.finished:
        progress.update(tarefa, advance=5)
        time.sleep(0.05)

Status & Spinners

import time
from rich.console import Console

console = Console()
with console.status("[bold blue]Processando..."):
    time.sleep(2)  # seu trabalho aqui
console.print("[green]Pronto![/]")

Live (painéis atualizados em tempo real)

import time
from rich.live import Live
from rich.table import Table

def tabela(tick):
    tb = Table(title=f"Tick {tick}")
    tb.add_column("Item"); tb.add_column("Valor", justify="right")
    for i in range(3):
        tb.add_row(f"X{i}", str(tick * (i + 1)))
    return tb

with Live(tabela(0), refresh_per_second=4) as live:
    for n in range(1, 6):
        time.sleep(0.5)
        live.update(tabela(n))

Útil para dashboards de CLI, monitores, scraping, etc.

Syntax (realce de código)

from rich.console import Console
from rich.syntax import Syntax

code = "def soma(a, b):\n    return a + b\n"
syntax = Syntax(code, "python", theme="monokai", line_numbers=True)
Console().print(syntax)

Markdown

from rich.console import Console
from rich.markdown import Markdown

md = Markdown("# Título\n*Itálico* **Negrito**\n- Lista 1\n- Lista 2")
Console().print(md)

Traceback bonito

from rich.traceback import install
install(show_locals=True)  # melhora tracebacks globais

def falha():
    x = 1 / 0
falha()

Logging com Rich

import logging
from rich.logging import RichHandler

logging.basicConfig(
    level="INFO",
    format="%(message)s",
    handlers=[RichHandler(rich_tracebacks=True)]
)

log = logging.getLogger("app")
log.info("Servidor iniciado")

Prompt simples

from rich.prompt import Prompt, Confirm

nome = Prompt.ask("Seu nome", default="Aluno")
ok = Confirm.ask("Deseja continuar?", default=True)
print(nome, ok)

Progress avançado (múltiplas tarefas)

import time
from rich.progress import Progress, SpinnerColumn, BarColumn, TextColumn

with Progress(
    SpinnerColumn(),
    TextColumn("[progress.description]{task.description}"),
    BarColumn(),
    TextColumn("{task.percentage:>3.0f}%"),
) as progress:
    t1 = progress.add_task("Tarefa A", total=60)
    t2 = progress.add_task("Tarefa B", total=90)
    while not progress.finished:
        progress.update(t1, advance=2)
        progress.update(t2, advance=3)
        time.sleep(0.05)

Boas práticas & Dicas

  • Centralize a saída usando um único Console() compartilhado.
  • Evite misturar print() e console.print() em CLIs complexas.
  • Use Panel/Table para estruturar informações.
  • Combine Live + Progress para dashboards de terminal.
  • Habilite tracebacks ricos durante o desenvolvimento.

Cheat Sheet

from rich.console import Console
from rich.table import Table
from rich.panel import Panel
from rich.progress import Progress
from rich.syntax import Syntax

console = Console()
console.print("[bold green]OK[/]")

tb = Table(); tb.add_column("A"); tb.add_row("1"); console.print(tb)
console.print(Panel("Mensagem", title="Info"))

with Progress() as p:
    t = p.add_task("Baixando", total=100)
    p.update(t, advance=100)

console.print(Syntax("print('hi')", "python"))

Conclusões

  • rich eleva a experiência de CLIs: legibilidade, feedback e estética.
  • Explore componentes de alto nível para interfaces ricas no terminal.
  • Integre com logging, tracebacks e prompts para fluxo completo.