Skip to main content

pyvizion

Framework de automação de interface (RPA desktop) em Python: encontra botões e textos na tela, clica, digita e encadeia fluxos com recuperação de falhas.

Python PyPI Licença

O que é

O pyvizion é uma extensão e evolução da linha de automação desktop iniciada pelo bot-vision-suite (repositório): mesma ideia central (imagem + OCR + backtrack), com melhorias de configuração, robustez em legado corporativo, CLI e manutenção contínua neste pacote (pip install pyvizion).

Autoria: desenvolvido e mantido por Josias Azevedo da Silva. Créditos ao bot-vision-suite e aos autores originais pela base conceitual e pela API de referência (MIT).

Foi feito para operar sistemas legados no Windows (e Linux/macOS onde aplicável): ERPs, Oracle Forms, Delphi/VB6, Java Swing, Citrix/RDP e terminais. Na prática você combina recortes PNG, OCR e teclas — sem depender de API do aplicativo.

Camada Tecnologia
Visão OpenCV — match multi-escala, DPI, vários monitores
Texto Tesseract — busca e leitura com perfis fast / balanced / all
Ação PyAutoGUI — clique, digitação, atalhos
Fluxo Backtrack — se um passo falha, reexecuta o anterior e tenta de novo; sessões e listas de tarefas

Instale com pip install pyvizion. Pacote: pypi.org/project/pyvizion. Licença MIT: LICENSE.

from pyvizion import Vizion

vz = Vizion()
vz.click_image("menu.png", backtrack=True)
vz.click_text("Relatórios", backtrack=True)
vz.click_text("Confirmar", sendtext="{enter}")

Versões antigas no PyPI (0.3.x) usavam outra API. Use a série 1.0+ (from pyvizion import Vizion).


📦 Instalação

pip install pyvizion

Uma instalação só, com tudo incluído e já no modo mais rápido.

Tesseract (só para funções de texto — click_text, find_text, read_text):

  • Windows: https://github.com/UB-Mannheim/tesseract/wiki — instale em C:\Program Files\Tesseract-OCR\ e marque Portuguese.
  • Linux: sudo apt-get install tesseract-ocr tesseract-ocr-por
  • macOS: brew install tesseract tesseract-lang
python -m pyvizion doctor      # confere dependências, Tesseract, idiomas e monitores

🎯 Uso rápido

Backtrack entre métodos

vz = Vizion()
vz.click_image("menu.png", backtrack=True)
vz.click_text("Relatórios", backtrack=True)   # falhou? reexecuta o anterior e tenta de novo
vz.click_image("salvar.png", wait_until_found=True, wait_timeout=15)
vz.click_text("Confirmar", timeout=10)        # mesmo efeito: espera até 10 s
vz.find_image("ampulheta.png", wait_until_disappears=True, wait_timeout=60)
vz.click_image("ok.png", wait_until_disappears=True, wait_timeout=10)  # clica e espera sumir

Sessão de backtrack

vz.start_task_session()
vz.click_image("button1.png", backtrack=True)
vz.click_text("Clientes", backtrack=True)
vz.click_text("Novo", backtrack=True)
successful, total = vz.end_task_session()
print(f"Sucesso: {successful}/{total}")

Lista de tarefas

from pyvizion import execute_tasks

tasks = [
    {"image": "button.png", "region": (100, 100, 200, 50), "confidence": 0.9,
     "specific": False, "backtrack": True, "delay": 1, "mouse_button": "left"},

    {"text": "Login", "region": (50, 50, 300, 100), "char_type": "letters",
     "backtrack": True, "sendtext": "usuario123{tab}senha{enter}"},

    {"type": "relative_image", "anchor_image": "warning_icon.png",
     "target_image": "ok_button.png", "max_distance": 200},

    {"type": "click", "x": 500, "y": 300, "mouse_button": "right"},
    {"type": "type_text", "text": "Hello World!"},
    {"type": "keyboard_command", "command": "Ctrl+S", "delay": 1},
]

execute_tasks(tasks)            # ou: Vizion().execute_tasks(tasks)

🔧 Métodos

Método O que faz
click_image(..., wait_until_found, wait_until_disappears, wait_timeout) Encontra e clica numa imagem
find_image(..., wait_until_found, wait_until_disappears, wait_timeout, scales) Região ou None (se esperar sumir: caixa se desapareceu)
click_text(..., wait_until_found, wait_until_disappears, wait_timeout) Encontra e clica num texto
find_text(..., wait_until_found, wait_until_disappears, wait_timeout) Caixa do texto ou None
click_relative_image(..., sendtext, wait_until_found, wait_until_disappears, wait_timeout) Clica no alvo mais próximo de uma âncora
find_relative_image(...) Caixa do alvo mais próximo da âncora
click_image_near_text(anchor_text, target_image, ...) Clica na imagem mais próxima de um texto
click_coordinates(x, y, delay, mouse_button, backtrack) / click_at(location, ...) Clique em coordenadas
type_text(text, interval, delay, backtrack) Digita texto (aceita macros)
keyboard_command(command, delay, backtrack) "Ctrl+S", "F7", "Alt+Tab"...
wait_for_image(...) / wait_for_text(...) / wait_until_gone(...) Esperas
image_exists(...) / text_exists(...) / find_all_images(...) Verificações
click_any([...]) / find_any([...]) Primeiro alvo encontrado dentre alternativas
read_text(region, single_line) Lê o texto de uma área
extract_text_from_region(region, filter_type, ...) / get_last_extracted_text() Extrai todo o texto (OCR)
focus_window(title) / wait_window(title) / window_region(title) Janelas
press(key, presses) / hotkey(*keys) / scroll(clicks) / drag(start, end) / screenshot(path) Utilidades
execute_tasks(tasks) / execute_with_backtrack_between_tasks(tasks) Listas de tarefas
start_task_session() / end_task_session() Sessão de backtrack
configure_overlay(enabled, color, duration, width) / get_overlay_config() / test_overlay_colors() Overlay visual
list_windows() Títulos das janelas abertas

Parâmetros comuns

  • region=(x, y, largura, altura) — onde procurar. Use sempre que puder (OCR ~6× mais rápido, sem falsos positivos). vz.window_region("Título") devolve a área de uma janela.
  • specific=True — busca só na region. specific=False — tenta a região e depois a tela inteira, em escalas 0,8× a 1,2×.
  • mouse_button — "left", "right", "double", "move_to" (só passa o mouse), "middle", "triple".
  • filter_type — "letters", "numbers" ou "both". occurrence=2 — a segunda ocorrência em ordem de leitura.
  • offset=(dx, dy) — clica deslocado do alvo (ex.: o campo à direita do rótulo).
  • wait_until_found / wait_until_disappears / wait_timeout — mesma ordem e efeito do bot-vision-suite 1.3.0. Sem wait_timeout, usa o da config (padrão 30 s). timeout= continua como atalho do pyvizion.

Os métodos também existem como funções, sem instância: from pyvizion import click_image, find_text, execute_tasks.


📝 Preenchendo campos (sendtext)

sendtext é o texto digitado logo depois do clique. Dentro dele, palavras entre chaves { } são teclas:

vz.click_text("Usuário", offset=(150, 0), sendtext="admin{tab}senha123{enter}")

O que acontece, em ordem:

# Trecho O pyvizion faz
1 (clique) clica 150 px à direita do rótulo "Usuário" (dentro do campo)
2 admin digita "admin"
3 {tab} aperta Tab → vai para o campo de senha
4 senha123 digita "senha123"
5 {enter} aperta Enter → confirma

Receitas do dia a dia

Quero... sendtext
digitar num campo vazio "12345"
substituir o que já está no campo "{ctrl}a{del}12345"
digitar e ir para o próximo campo "12345{tab}"
digitar e confirmar "12345{enter}"
preencher dois campos seguidos "01/01/2026{tab}31/01/2026"
pular campos "{tab*3}"
esperar o sistema reagir "12345{tab}{wait 1}"

Prefira um passo por campo — fica mais fácil de ler e, se algo falhar, o log mostra exatamente onde:

vz.click_text("Data Inicial", offset=(150, 0), sendtext="{ctrl}a{del}01/01/2026")
vz.click_text("Data Final",   offset=(150, 0), sendtext="{ctrl}a{del}31/01/2026")
vz.keyboard_command("Enter")

Teclas disponíveis

Macro Tecla
{enter} {tab} {esc} {space} Enter, Tab, Esc, Espaço
{del} {backspace} {insert} Delete, Backspace, Insert
{up} {down} {left} {right} setas
{home} {end} {pgup} {pgdn} Home, End, Page Up, Page Down
{f1} … {f12} teclas de função
{ctrl}a {alt}f {shift}x modificador + a próxima letra
{ctrl+shift+s} {alt+f4} combinação completa
{tab*3} {down 5} repetição
{wait 1.5} {wait 300ms} pausa
{{ }} as chaves { e } literais
  • Maiúsculas não importam: {Enter} = {enter}.
  • Chaves com algo que não é tecla são digitadas normalmente: "valor {total}" digita exatamente isso.
  • Acentos e ç saem corretos, e a área de transferência do usuário é restaurada.
  • Em Citrix/RDP/terminais que não aceitam colar, use Vizion({"typing_mode": "type"}).

Para apertar só uma tecla, sem texto: vz.keyboard_command("Ctrl+S"), vz.press("tab", 3), vz.hotkey("ctrl", "shift", "s").


📋 Tarefas: todos os tipos

tasks = [
    {"type": "focus_window", "title": "Oracle Applications"},
    {"type": "wait_image", "image": "tela_principal.png", "timeout": 30},
    {"text": "Cliente", "offset": (160, 0), "sendtext": "12345{enter}", "required": True},
    {"type": "wait_image", "image": "ampulheta.png", "gone": True, "timeout": 60},
    {"type": "relative_image", "anchor_text": "Pedido", "target_image": "lupa.png"},
    {"image": "popup_aviso.png", "optional": True, "sendtext": "{enter}"},
    {"type": "wait_text", "text": "Registro salvo", "timeout": 15},
    {"type": "wait", "seconds": 1},
    {"type": "scroll", "clicks": -5},
]
Tipo Chaves
imagem image, region, confidence, specific, scales
texto text, region, char_type, occurrence, confidence_threshold
relative_image anchor_image ou anchor_text, target_image, max_distance, target_region
click x, y
type_text text, interval
keyboard_command command
wait_image / wait_text image/text, timeout, gone
wait · focus_window · scroll seconds · title · clicks, x, y

Chaves de qualquer tarefa: mouse_button, delay, sendtext, offset, backtrack, max_attempts, timeout, wait_until_found, wait_until_disappears, wait_timeout, optional (falha não conta nem faz backtrack), required (falha interrompe a lista), show_overlay, click_hold.


⚙️ Configuração

vz = Vizion({
    "confidence_threshold": 80.0,
    "tesseract_lang": "por",
    "show_overlay": False,
    "image_folders": ["./imagens"],
    "save_failure_screenshots": True,
})

vz.config.set("show_overlay", True)          # alterar depois
vz = Vizion("pyvizion.json")                  # ou de um arquivo .json/.yaml
Chave Padrão Descrição
confidence_threshold 75.0 Limiar do OCR (0–100)
default_confidence 0.9 Confiança padrão de imagens nas tarefas
tesseract_path / tessdata_path auto Caminhos do Tesseract
tesseract_lang auto (por se instalado) Idioma(s): "por", "por+eng"
image_processing_methods "all" "all", "balanced", "fast" ou lista de técnicas
ocr_large_image_methods "fast" Técnicas usadas na tela inteira
preprocessing_enabled True False = OCR só na imagem original
ocr_upscale / ocr_workers 2.0 / auto Ampliação de áreas pequenas / paralelismo
ocr_fuzzy / ocr_fuzzy_threshold True / 0.8 Tolerância a erros do OCR
grayscale · scales · dpi_scales · edge_fallback True · 0,8–1,2 · True · False Busca de imagem
min_confidence · retry_delay · timeout (wait_timeout) 0.7 · 0.5 · 30 Tentativas e espera padrão (wait_until_found)
overlay_enabled True Liga/desliga o sistema de overlay
image_folders [] Pastas onde procurar imagens
typing_mode · restore_clipboard · typing_interval "paste" · True · 0.02 Digitação
click_hold · move_pause · movement_duration 0 · 0.15 · 0.1 Ritmo do mouse
failsafe True Mouse no canto superior esquerdo interrompe
show_overlay · overlay_color · overlay_duration · overlay_width False · red · 1000 · 4 Retângulo sobre o alvo antes do clique (depuração)
save_failure_screenshots · failure_screenshot_dir False · pyvizion_failures Print a cada falha
stop_on_failure · max_backtrack_attempts False · 2 Listas de tarefas
log_level "INFO"

🛡️ Robustez para sistemas legados

  • DPI e vários monitores — modo DPI por monitor, captura de todos os monitores (inclusive coordenadas negativas); a escala de cada monitor (125%, 150%) entra automaticamente na busca.
  • OCR tolerante — ignora acentos e maiúsculas, corrige 0/O, 1/l, 5/S, aceita pequenas diferenças e palavras coladas/quebradas, amplia áreas pequenas, inverte texto claro em fundo escuro, roda em paralelo e usa consenso entre leituras.
  • Captura rápida — ~5 ms por área.
  • Esperas, alternativas (click_any), âncoras (click_relative_image, click_image_near_text), clique deslocado (offset), leitura de campos (read_text), foco de janela.
  • Listas seguras — required, optional, stop_on_failure.
  • Diagnóstico — prints de falha e python -m pyvizion doctor.

🛠️ Linha de comando

python -m pyvizion doctor               # ambiente
python -m pyvizion screenshot tela.png  # print para recortar suas imagens
python -m pyvizion position             # x/y do mouse em tempo real (Ctrl+C)
python -m pyvizion pick                 # marca região (2 cantos), OCR e trechos para colar no código
python -m pyvizion ocr 100 200 300 40   # lê o texto de uma área (se já souber x,y,w,h)

💡 Dicas

  1. Use region (ou vz.window_region("Título")) sempre que puder.
  2. Recorte imagens pequenas e únicas (o ícone, não o botão inteiro), em PNG.
  3. Prefira wait_until_gone("ampulheta.png") a delay fixo.
  4. Comece com focus_window("Título").
  5. Instale o idioma por do Tesseract.
  6. Para parar o robô, leve o mouse ao canto superior esquerdo da tela.

🧪 Desenvolvimento

pip install -e .[dev]
pytest

📄 Licença e créditos

Licenciado sob MIT - texto completo em LICENSE.

pyvizion Copyright © 2026 Josias Azevedo da Silva
Base bot-vision-suite (MIT) — projeto de referência para automação GUI com OCR e detecção de imagens

O pyvizion não substitui o bot-vision-suite no PyPI; é um pacote separado com melhorias e API Vizion / from pyvizion import …, mantido por Josias Azevedo da Silva.

Metadata

Release files for pyvizion 1.0.3

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for pyvizion 1.0.3
File Size Uploaded
pyvizion-1.0.3.tar.gz 65.2 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for pyvizion 1.0.3
File Interpreter ABI Platform
pyvizion-1.0.3-py3-none-any.whl Python 3 none any Details

Total release size: 134.9 kB

Release files / pyvizion-1.0.3.tar.gz

Download URL pyvizion-1.0.3.tar.gz
Size 65.2 kB
Tags Source
SHA-256 checksum
How to use checksums
f1319f5973c22499943704bfbfe3eebfc0b668fb04552df738d5862d3ce8e1f0
BLAKE2b-256 checksum
How to use checksums
34e386fe492ee792c342a1b23b40fbc3e9eb68ce978b2f69dd595a5e511cc631
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.12.0

Release files / pyvizion-1.0.3-py3-none-any.whl

Download URL pyvizion-1.0.3-py3-none-any.whl
Size 69.7 kB
Tags Python 3
SHA-256 checksum
How to use checksums
fc519e8fa62dcf0182e3880f30c61bde322fefebe08b6d383227880510dc0de3
BLAKE2b-256 checksum
How to use checksums
83bf10501b16201aa2367e9f7167c1d518bda72426a6ea488e497006617c6d17
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.12.0

Release history Release notifications | RSS feed

1.0.8

2 release files

1.0.7

2 release files

1.0.6

2 release files

1.0.5

2 release files

1.0.4

2 release files

This release

1.0.3 This release

2 release files

1.0.2

2 release files

1.0.1

2 release files

1.0.0

2 release files

0.3.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page