← Files Pesquisa MirandasTechARCHIVED FILE

scripts/ensaio_defesa.py

2.53 KB · Oct 3, 2026 · 06:34 UTC

↓ Download file

#!/usr/bin/env python3
r"""Cronômetro de ensaio da apresentação: marca o tempo de cada bloco enquanto você fala e compara com o previsto.

    python3 scripts/ensaio_defesa.py --minutos 30 [--blocos "Abertura;Contexto;Objetivos;Método;Resultados;Discussão;Conclusão"] [--previsto "10;15;5;20;30;10;10"] [--saida ensaio.csv]

Uso: pressione Enter ao terminar cada bloco; o script registra o tempo real, mostra a diferença para o previsto (em %) e, no fim, o total e os blocos que estouraram. Grava um CSV por ensaio para comparar ensaios sucessivos. Sem áudio, sem IA: só o relógio.
"""
import argparse, csv, datetime, time

def main():
    ap = argparse.ArgumentParser(description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter)
    ap.add_argument("--minutos", type=float, required=True); ap.add_argument("--blocos", default="Abertura;Contexto;Objetivos;Método;Resultados;Discussão;Conclusão"); ap.add_argument("--previsto", default="10;15;5;20;30;10;10"); ap.add_argument("--saida", default=None); ap.add_argument("--simular", default=None, help="tempos reais em segundos separados por ; (para testes, sem esperar)")
    a = ap.parse_args(); blocos = a.blocos.split(";"); pct = [float(x) for x in a.previsto.split(";")]
    if len(blocos) != len(pct): raise SystemExit("blocos e previsto com tamanhos diferentes")
    prev = [a.minutos * 60 * p / sum(pct) for p in pct]; sim = [float(x) for x in a.simular.split(";")] if a.simular else None
    print(f"Ensaio de {a.minutos:g} min em {len(blocos)} blocos — Enter ao terminar cada bloco\n"); linhas = []; t0 = time.time(); tot = 0
    for i, (b, p) in enumerate(zip(blocos, prev)):
        if sim: real = sim[i]
        else:
            ini = time.time(); input(f"[{i+1}/{len(blocos)}] {b} (previsto {p/60:.1f} min) … "); real = time.time() - ini
        tot += real; dif = (real - p) / p * 100; marca = "ESTOUROU" if dif > 15 else ("curto" if dif < -30 else "ok")
        print(f"   {b:14} real {real/60:5.1f} min · previsto {p/60:5.1f} · {dif:+5.0f} %  {marca}"); linhas.append([b, f"{p/60:.2f}", f"{real/60:.2f}", f"{dif:+.0f}", marca])
    print(f"\nTotal: {tot/60:.1f} min de {a.minutos:g} previstos ({(tot/60 - a.minutos):+.1f} min)")
    if a.saida:
        with open(a.saida, "a", newline="", encoding="utf-8") as f:
            w = csv.writer(f); w.writerow(["data", "bloco", "previsto_min", "real_min", "dif_pct", "avaliacao"]); [w.writerow([datetime.datetime.now().isoformat(timespec="minutes")] + l) for l in linhas]
        print(f"gravado: {a.saida}")

if __name__ == "__main__": main()

SHA-256: e99dad735fb02b18638dac9afe0ae5105eff31967c1230ee9a29c4e0a9860cd2