UFPR LicComp
GRADIO — Interface Web para Python
Prof. Jéfer Prof. Jéfer Benedett Dörr • UFPR Palotina

🎯 Gradio: Crie interfaces web para Python em segundos

Transforme qualquer função Python em uma aplicação web interativa. Ideal para demonstrar modelos, compartilhar análises e criar protótipos rápidos.
✨ Diferencial: Código 100% funcional — copie, cole no Google Colab e execute imediatamente. Não precisa instalar nada localmente.
🚀 Como funciona?

📌 Conceito básico

1. Escreva uma função Python
2. Defina inputs e outputs
3. Pronto! Sua interface web está no ar

💡 Onde usar

  • Demonstrar modelos de ML
  • Prototipar ferramentas
  • Compartilhar análises
  • Ensinar programação
☁️ Google Colab (recomendado)

A maneira mais simples de começar: use o Google Colab direto do navegador.

📋 Código para Colab
# 1. Instalar (só precisa uma vez)
!pip install gradio

# 2. Importar e criar app
import gradio as gr

def saudacao(nome):
    return f"Olá {nome}! Bem-vindo ao Gradio 🎉"

# Criar interface
demo = gr.Interface(
    fn=saudacao,
    inputs=gr.Textbox(label="Seu nome"),
    outputs=gr.Textbox(label="Mensagem"),
    title="Meu Primeiro Gradio",
    description="Teste digitar seu nome"
)

# 3. Executar (abre um link)
demo.launch()

▶️ Execute cada célula em ordem. O link aparecerá automaticamente.

📝 Exemplo 1: Chatbot simples

Um assistente que responde perguntas básicas.

🤖 chatbot.py
import gradio as gr

def responder(pergunta):
    respostas = {
        "oi": "Olá! Como posso ajudar?",
        "tudo bem": "Tudo ótimo! E você?",
        "qual seu nome": "Sou um assistente Gradio 🤖",
        "obrigado": "Por nada! 😊"
    }
    pergunta = pergunta.lower().strip()
    return respostas.get(pergunta, "Desculpe, não entendi. Pode reformular?")

with gr.Blocks(title="Assistente Virtual", theme=gr.themes.Soft()) as demo:
    gr.Markdown("## 💬 Assistente Virtual")
    gr.Markdown("Digite: oi, tudo bem, qual seu nome")
    
    with gr.Row():
        entrada = gr.Textbox(label="Sua mensagem", placeholder="Digite algo...")
        saida = gr.Textbox(label="Resposta", interactive=False)
    
    btn = gr.Button("Enviar", variant="primary")
    btn.click(fn=responder, inputs=entrada, outputs=saida)
    
    gr.Examples(
        examples=[["oi"], ["tudo bem"], ["qual seu nome"]],
        inputs=entrada
    )

demo.launch()
📊 Exemplo 2: Análise de dados

Upload de CSV + estatísticas + gráfico automático

📈 analise.py
import gradio as gr
import pandas as pd
import plotly.express as px

def analisar_dados(arquivo):
    if arquivo is None:
        return "Envie um arquivo CSV", None
    
    # Ler dados
    df = pd.read_csv(arquivo.name)
    
    # Resumo
    resumo = f"""
    📁 Arquivo: {arquivo.name}
    📊 Linhas: {len(df):,}
    📋 Colunas: {len(df.columns)}
    
    📌 Colunas disponíveis:
    {', '.join(df.columns[:10])}
    """
    
    # Gráfico da primeira coluna numérica
    num_cols = df.select_dtypes(include='number').columns
    if len(num_cols) > 0:
        fig = px.histogram(df, x=num_cols[0], title=f"Distribuição de {num_cols[0]}")
        return resumo, fig
    
    return resumo + "\n⚠️ Nenhuma coluna numérica encontrada", None

with gr.Blocks(title="Analisador CSV") as demo:
    gr.Markdown("# 📂 Analisador Rápido de CSV")
    
    arquivo = gr.File(label="Selecione um arquivo CSV", file_types=[".csv"])
    resumo = gr.Textbox(label="Resumo", lines=8)
    grafico = gr.Plot(label="Visualização")
    
    btn = gr.Button("Analisar", variant="primary")
    btn.click(fn=analisar_dados, inputs=arquivo, outputs=[resumo, grafico])

demo.launch()
🌍 Exemplo 3: Agro 5.0 (recomendação agrícola)

Sistema de recomendação baseado em regras — fácil de adaptar para ML.

🌱 agro.py
import gradio as gr

def recomendar(umidade, temperatura, cultura):
    """Sistema de recomendação agrícola"""
    
    if cultura == "Soja":
        if umidade < 30 and temperatura > 30:
            return "🚨 Risco de estresse hídrico! Avaliar irrigação."
        elif umidade > 80:
            return "⚠️ Umidade muito alta: risco de fungos. Monitorar."
        else:
            return "✅ Condições adequadas. Manter manejo."
            
    elif cultura == "Milho":
        if temperatura < 15:
            return "❄️ Temperatura baixa: risco de geada. Proteger plantio."
        elif umidade < 25:
            return "💧 Umidade baixa: considerar irrigação suplementar."
        else:
            return "🌽 Condições normais para o milho."
    
    return "🤖 Análise básica: condições dentro da normalidade."

with gr.Blocks(title="Agro 5.0 - Assistente de Manejo", theme=gr.themes.Soft()) as demo:
    gr.Markdown("""
    # 🌾 Assistente de Manejo Agrícola
    Sistema de recomendação para tomada de decisão no campo
    """)
    
    with gr.Row():
        with gr.Column():
            umidade = gr.Slider(0, 100, value=50, label="Umidade do solo (%)", step=5)
            temperatura = gr.Slider(0, 45, value=25, label="Temperatura (°C)", step=1)
            cultura = gr.Dropdown(["Soja", "Milho", "Trigo"], value="Soja", label="Cultura")
            
        with gr.Column():
            saida = gr.Textbox(label="Recomendação", lines=5)
    
    btn = gr.Button("Gerar Recomendação", variant="primary", size="lg")
    btn.click(fn=recomendar, inputs=[umidade, temperatura, cultura], outputs=saida)
    
    gr.Examples(
        examples=[
            [25, 32, "Soja"],
            [85, 24, "Soja"],
            [20, 14, "Milho"],
            [30, 28, "Milho"]
        ],
        inputs=[umidade, temperatura, cultura]
    )
    
    gr.Markdown("""
    ---
    **📌 Como usar:** ajuste os parâmetros e clique no botão.
    **💡 Próximo passo:** substitua as regras por um modelo de Machine Learning!
    """)

demo.launch()
⚡ Exemplo 4: Calculadora com abas

Demonstração de múltiplas funcionalidades em um único app.

🧮 calculadora.py
import gradio as gr

def operacoes_basicas(num1, num2, operacao):
    if operacao == "Somar":
        return num1 + num2
    elif operacao == "Subtrair":
        return num1 - num2
    elif operacao == "Multiplicar":
        return num1 * num2
    elif operacao == "Dividir":
        return num1 / num2 if num2 != 0 else "Erro: divisão por zero"

def conversor_temperatura(celsius):
    return {
        "Fahrenheit": (celsius * 9/5) + 32,
        "Kelvin": celsius + 273.15
    }

with gr.Blocks(title="Calculadora Multi-função") as demo:
    gr.Markdown("# 🧮 Calculadora Inteligente")
    
    with gr.Tab("Operações Básicas"):
        with gr.Row():
            n1 = gr.Number(label="Número 1", value=0)
            n2 = gr.Number(label="Número 2", value=0)
        oper = gr.Dropdown(["Somar", "Subtrair", "Multiplicar", "Dividir"], label="Operação")
        resultado = gr.Number(label="Resultado")
        btn_calc = gr.Button("Calcular")
        btn_calc.click(fn=operacoes_basicas, inputs=[n1, n2, oper], outputs=resultado)
    
    with gr.Tab("Conversor de Temperatura"):
        temp_c = gr.Slider(-50, 100, value=25, label="Temperatura (°C)")
        temp_f = gr.Number(label="Fahrenheit", interactive=False)
        temp_k = gr.Number(label="Kelvin", interactive=False)
        
        def atualizar_temp(c):
            conv = conversor_temperatura(c)
            return conv["Fahrenheit"], conv["Kelvin"]
        
        temp_c.change(fn=atualizar_temp, inputs=temp_c, outputs=[temp_f, temp_k])

demo.launch()
🎯 Principais recursos do Gradio

📥 Inputs disponíveis

  • gr.Textbox() - texto
  • gr.Number() - números
  • gr.Slider() - controle deslizante
  • gr.Dropdown() - menu suspenso
  • gr.File() - upload de arquivos
  • gr.Image() - imagens
  • gr.Audio() - áudio
  • gr.DataFrame() - tabelas

📤 Outputs disponíveis

  • gr.Textbox() - texto
  • gr.Number() - números
  • gr.Image() - imagens
  • gr.Plot() - gráficos
  • gr.File() - download
  • gr.DataFrame() - tabelas
  • gr.HTML() - HTML customizado
  • gr.JSON() - dados JSON
📱 Compartilhando seu app

🔗 Link público temporário

demo.launch(share=True)  # Cria link público por 72h

Perfeito para apresentar trabalhos e testes rápidos

🚀 Espaços Hugging Face

# Hospedagem gratuita permanente
demo.launch()  # Faça deploy no Hugging Face Spaces

Publique seu app permanentemente de graça

⚠️ Atenção: O modo share=True gera link público. Não compartilhe dados sensíveis.
📌 Roteiro rápido para começar
  1. Acesse o Google Colab: colab.research.google.com
  2. Crie um novo notebook: Arquivo → Novo notebook
  3. Instale o Gradio: !pip install gradio
  4. Cole um dos exemplos acima em uma célula
  5. Execute: Shift + Enter
  6. Clique no link que aparecer
✨ Pronto! Em menos de 2 minutos você tem uma interface web funcionando.
🐛 Solução de problemas
Problema Solução
"ModuleNotFoundError" Execute !pip install gradio novamente
Link não abre Use demo.launch(share=True) para link público
Arquivo não carrega No Colab, faça upload manual primeiro
Interface lenta Reduza a quantidade de dados processados