Curso completo do zero ao avançado com exercícios, exemplos reais e material didático profissional.
# Atualizar pacotes pkg update && pkg upgrade -y # Instalar Python e pip pkg install python -y # Instalar Streamlit pip install streamlit # Verificar instalação streamlit --version # Criar pasta do projeto mkdir ~/meu_streamlit cd ~/meu_streamlit
import streamlit as st # Título da página st.title("🎉 Meu Primeiro App!") # Texto simples st.write("Olá, mundo! Streamlit funcionando!") # Input do usuário nome = st.text_input("Qual é o seu nome?") if nome: st.success(f"Bem-vindo, {nome}! 👋")
# Rodar o app streamlit run app.py # Abrir no navegador do celular: # http://localhost:8501
app.py e execute-o com sucessoStreamlit oferece várias funções para exibir texto com diferentes estilos e níveis hierárquicos.
import streamlit as st st.title("Título Principal") # H1 st.header("Cabeçalho") # H2 st.subheader("Subcabeçalho") # H3 st.text("Texto simples") # Monoespaçado st.write("Texto geral, aceita **markdown**") # Markdown completo st.markdown(""" ### Formatação Markdown - **Negrito**, *itálico*, `código inline` - [Link](https://streamlit.io) - > Citação """) # Código formatado st.code("print('Hello!')", language="python") # Fórmulas matemáticas (LaTeX) st.latex(r"E = mc^2")
import streamlit as st # Duas colunas iguais col1, col2 = st.columns(2) with col1: st.header("Coluna 1") st.write("Conteúdo à esquerda") with col2: st.header("Coluna 2") st.write("Conteúdo à direita") # Colunas com proporções diferentes (2:1:1) c1, c2, c3 = st.columns([2, 1, 1]) # Sidebar (barra lateral) st.sidebar.title("Menu") opcao = st.sidebar.selectbox("Ir para", ["Home", "Sobre"]) # Expander (acordeão) with st.expander("Clique para expandir"): st.write("Conteúdo oculto aqui!")
import streamlit as st # Abas (Tabs) — muito útil no mobile! tab1, tab2, tab3 = st.tabs(["📊 Dados", "📈 Gráfico", "ℹ️ Info"]) with tab1: st.write("Tabela de dados aqui") with tab2: st.write("Gráfico aqui") with tab3: st.write("Informações aqui")
st.tabs() para criar 3 abas: "Sobre Mim", "Hobbies" e "Contato"import streamlit as st # ── Texto ── nome = st.text_input("Nome", placeholder="Digite seu nome") bio = st.text_area("Biografia", height=100) # ── Numérico ── idade = st.number_input("Idade", min_value=0, max_value=120, value=25) volume = st.slider("Volume", 0, 100, 50) # Range slider faixa = st.slider("Faixa de preço", 0, 1000, (100, 500)) # ── Seleção ── cidade = st.selectbox("Cidade", ["SP", "RJ", "BH", "POA"]) frutas = st.multiselect("Frutas favoritas", ["🍎 Maçã", "🍊 Laranja", "🍇 Uva"]) # ── Toggle / Checkbox ── aceito = st.checkbox("Aceito os termos") modo = st.toggle("Modo escuro") # ── Radio ── plano = st.radio("Plano", ["Free", "Pro", "Enterprise"], horizontal=True) # ── Data e hora ── import datetime data = st.date_input("Data") hora = st.time_input("Hora") # ── Botão ── if st.button("🚀 Enviar", type="primary"): st.success("Formulário enviado!") st.write(f"Nome: {nome}, Cidade: {cidade}")
import streamlit as st st.title("🏋️ Calculadora de IMC") col1, col2 = st.columns(2) with col1: peso = st.number_input("Peso (kg)", 30.0, 200.0, 70.0) with col2: altura = st.number_input("Altura (m)", 1.0, 2.5, 1.70) if st.button("Calcular", type="primary"): imc = peso / (altura ** 2) st.metric("Seu IMC", f"{imc:.1f}") if imc < 18.5: st.warning("⚠️ Abaixo do peso") elif imc < 25: st.success("✅ Peso normal") elif imc < 30: st.warning("⚠️ Sobrepeso") else: st.error("❌ Obesidade")
st.radio() e exiba os resultados em tempo real com st.metric()pip install matplotlib plotly pandas numpy
import streamlit as st import pandas as pd import numpy as np st.title("📊 Gráficos com Streamlit") # Dados de exemplo df = pd.DataFrame({ "mês": ["Jan", "Fev", "Mar", "Abr", "Mai"], "vendas": [120, 145, 98, 175, 210], "lucro": [30, 45, 20, 60, 80] }) # Gráfico de linha nativo st.subheader("Linha") st.line_chart(df.set_index("mês")) # Gráfico de barras nativo st.subheader("Barras") st.bar_chart(df.set_index("mês")["vendas"]) # Gráfico de área nativo st.subheader("Área") st.area_chart(df.set_index("mês"))
import streamlit as st import plotly.express as px import pandas as pd st.title("📈 Gráficos Plotly Interativos") # Dataset embutido df = px.data.gapminder().query("year == 2007") # Scatter plot com zoom e hover fig = px.scatter( df, x="gdpPercap", y="lifeExp", size="pop", color="continent", hover_name="country", log_x=True, title="PIB vs Expectativa de Vida (2007)" ) st.plotly_chart(fig, use_container_width=True) # Gráfico de pizza vendas_cidade = pd.DataFrame({ "Cidade": ["SP", "RJ", "BH", "RS"], "Vendas": [450, 320, 180, 150] }) fig2 = px.pie(vendas_cidade, values="Vendas", names="Cidade") st.plotly_chart(fig2, use_container_width=True)
st.slider() para filtrar o período exibido no gráficoimport streamlit as st import pandas as pd # Criar DataFrame df = pd.DataFrame({ "Nome": ["Ana", "Carlos", "Maria", "João"], "Idade": [28, 35, 22, 42], "Salário": [5000, 8000, 3500, 12000], "Cidade": ["SP", "RJ", "SP", "BH"] }) # Tabela estática st.table(df) # Tabela interativa (com ordenação) st.dataframe(df, use_container_width=True) # Tabela editável! df_edit = st.data_editor(df, num_rows="dynamic") st.write("Dados editados:", df_edit)
import streamlit as st import pandas as pd st.title("🔍 Filtros em DataFrame") # Dataset df = pd.DataFrame({ "produto": ["Notebook","Mouse","Teclado","Monitor","Headset"], "preço": [3500, 120, 280, 1200, 450], "estoque": [10, 50, 30, 15, 25], "categoria":["PC","PC","PC","PC","Áudio"] }) # Filtros na sidebar with st.sidebar: st.header("⚙️ Filtros") preco_max = st.slider( "Preço máximo", int(df.preço.min()), int(df.preço.max()), int(df.preço.max()) ) cats = st.multiselect( "Categoria", df.categoria.unique(), default=df.categoria.unique() ) # Aplicar filtros df_filtrado = df[ (df.preço <= preco_max) & (df.categoria.isin(cats)) ] st.metric("Produtos encontrados", len(df_filtrado)) st.dataframe(df_filtrado, use_container_width=True)
import streamlit as st import pandas as pd arquivo = st.file_uploader("📂 Carregue seu CSV", type=["csv"]) if arquivo: df = pd.read_csv(arquivo) st.success(f"✅ {len(df)} linhas carregadas!") col1, col2, col3 = st.columns(3) col1.metric("Linhas", df.shape[0]) col2.metric("Colunas", df.shape[1]) col3.metric("Tamanho", f"{arquivo.size // 1024} KB") st.dataframe(df.head(10))
st.text_input() + str.contains()st.session_state permite persistir dados entre essas execuções.
import streamlit as st # Inicializar estado (sempre verificar antes) if "contador" not in st.session_state: st.session_state.contador = 0 st.title("🔢 Contador Persistente") st.metric("Contagem atual", st.session_state.contador) col1, col2, col3 = st.columns(3) if col1.button("➕ +1"): st.session_state.contador += 1 if col2.button("➖ -1"): st.session_state.contador -= 1 if col3.button("🔄 Zerar"): st.session_state.contador = 0
import streamlit as st # Inicializar carrinho if "carrinho" not in st.session_state: st.session_state.carrinho = [] produtos = { "☕ Café": 8.90, "🍕 Pizza": 35.00, "🍺 Cerveja": 12.00, "🍔 Hambúrguer": 28.00 } st.title("🛒 Carrinho de Compras") # Adicionar produto col1, col2 = st.columns([3, 1]) escolha = col1.selectbox("Produto", list(produtos.keys())) if col2.button("Adicionar", type="primary"): st.session_state.carrinho.append({ "item": escolha, "preço": produtos[escolha] }) # Exibir carrinho if st.session_state.carrinho: st.subheader("Seu Carrinho") total = 0 for i, item in enumerate(st.session_state.carrinho): c1, c2, c3 = st.columns([3, 1, 1]) c1.write(item["item"]) c2.write(f"R$ {item['preço']:.2f}") total += item["preço"] st.divider() st.metric("Total", f"R$ {total:.2f}") if st.button("🗑️ Limpar carrinho"): st.session_state.carrinho = [] st.rerun()
pip install requests
import streamlit as st import requests # @st.cache_data → chama a API apenas 1x # Os dados ficam em cache por 1 hora @st.cache_data(ttl=3600) def buscar_pokemon(nome): url = f"https://pokeapi.co/api/v2/pokemon/{nome.lower()}" r = requests.get(url) if r.status_code == 200: return r.json() return None st.title("🎮 Pokédex Streamlit") nome = st.text_input("Nome do Pokémon", "pikachu") if st.button("🔍 Buscar", type="primary"): with st.spinner("Buscando..."): dados = buscar_pokemon(nome) if dados: col1, col2 = st.columns(2) col1.image(dados["sprites"]["front_default"], width=150) col2.metric("Altura", f"{dados['height']/10}m") col2.metric("Peso", f"{dados['weight']/10}kg") tipos = [t["type"]["name"] for t in dados["types"]] st.write(f"**Tipos:** {', '.join(tipos)}") else: st.error("Pokémon não encontrado!")
import streamlit as st import time import random st.title("📡 Dashboard Tempo Real") # Placeholder que será atualizado placeholder = st.empty() for i in range(30): temperatura = random.uniform(20, 30) with placeholder.container(): st.metric("🌡️ Temperatura", f"{temperatura:.1f}°C") st.progress((temperatura - 20) / 10) time.sleep(1)
@st.cache_data para evitar chamadas repetidasmeu_app/
├── app.py ← Página principal
├── pages/
│ ├── 1_📊_dados.py ← Página Dados
│ ├── 2_📈_graficos.py ← Página Gráficos
│ └── 3_ℹ️_sobre.py ← Página Sobre
└── utils/
└── helpers.py ← Funções reutilizáveis
import streamlit as st import pandas as pd import plotly.express as px import numpy as np from datetime import date, timedelta # ── Configuração da página ── st.set_page_config( page_title="💰 Dashboard Financeiro", page_icon="💰", layout="wide", initial_sidebar_state="expanded" ) # ── Estilo customizado ── st.markdown(""" <style> .metric-card { background: #1a2235; border-radius: 10px; padding: 16px; border: 1px solid #1e2d47; } </style> """, unsafe_allow_html=True) # ── Gerar dados fictícios ── @st.cache_data def gerar_dados(): datas = [date(2024,1,1) + timedelta(days=i) for i in range(365)] np.random.seed(42) return pd.DataFrame({ "data": datas, "receita": np.random.normal(10000, 2000, 365).cumsum(), "despesa": np.random.normal(7000, 1500, 365).cumsum(), "categoria": np.random.choice(["Vendas","Serviços","Outros"], 365) }) df = gerar_dados() # ── Sidebar ── with st.sidebar: st.image("https://via.placeholder.com/200x60?text=FinanceApp") data_ini = st.date_input("Data inicial", date(2024,1,1)) data_fim = st.date_input("Data final", date(2024,12,31)) cats = st.multiselect("Categorias", df.categoria.unique(), default=df.categoria.unique()) # Filtrar mask = (df.data.apply(lambda x: x) >= pd.Timestamp(data_ini)) & \ (df.data <= pd.Timestamp(data_fim)) & \ (df.categoria.isin(cats)) df_f = df[mask] # ── KPIs ── st.title("💰 Dashboard Financeiro") k1, k2, k3, k4 = st.columns(4) k1.metric("Receita Total", f"R$ {df_f.receita.iloc[-1]/1e6:.1f}M") k2.metric("Despesa Total", f"R$ {df_f.despesa.iloc[-1]/1e6:.1f}M") k3.metric("Lucro", f"R$ {(df_f.receita-df_f.despesa).iloc[-1]/1e6:.1f}M", delta="+12%") k4.metric("Registros", len(df_f)) # ── Gráfico Principal ── fig = px.line(df_f, x="data", y=["receita","despesa"], title="📈 Evolução Financeira", labels={"value":"R$","data":"Data"}) st.plotly_chart(fig, use_container_width=True) # ── Tabela ── st.dataframe(df_f.tail(20), use_container_width=True)
# 1. Criar requirements.txt echo "streamlit pandas plotly numpy" > requirements.txt # 2. Subir para GitHub git init git add . git commit -m "primeiro commit" git remote add origin https://github.com/SEU_USER/SEU_REPO git push -u origin main # 3. Acessar share.streamlit.io # 4. Conectar repositório e fazer deploy!
Crie um dos seguintes projetos completos:
| Função | Uso |
|---|---|
st.title() | Título principal (H1) |
st.header() | Cabeçalho (H2) |
st.write() | Texto + markdown + dados |
st.markdown() | Markdown completo |
st.code() | Bloco de código |
st.metric() | Card com número + delta |
st.divider() | Linha separadora |
st.spinner() | Loading animado |
st.success() | Alerta verde |
st.error() | Alerta vermelho |
st.warning() | Alerta amarelo |
st.info() | Alerta azul |
| Widget | Retorna |
|---|---|
st.text_input() | str |
st.number_input() | int/float |
st.slider() | int/float/tuple |
st.selectbox() | str (1 item) |
st.multiselect() | list |
st.checkbox() | bool |
st.radio() | str |
st.button() | bool (True 1x) |
st.file_uploader() | UploadedFile |
st.date_input() | date |
| Layout | Como usar |
|---|---|
st.columns(n) | c1,c2 = st.columns(2) |
st.tabs() | t1,t2 = st.tabs(["A","B"]) |
st.sidebar | st.sidebar.write() |
st.expander() | with st.expander("+") |
st.container() | with st.container() |
st.empty() | placeholder atualizável |
# Cache de função @st.cache_data(ttl=3600) def carregar(): ... # Session state if "x" not in st.session_state: st.session_state.x = 0 # Rerun forçado st.rerun() # Configuração da página (DEVE ser 1ª chamada) st.set_page_config( page_title="App", layout="wide", page_icon="🚀" )
Projetos completos para praticar todos os conceitos
Operações básicas, trigonométricas e logarítmicas com histórico de cálculos usando session_state.
Dashboard de ações com gráfico de candlestick, médias móveis e indicadores técnicos.
pip install yfinance plotly
Clima em tempo real usando a API gratuita Open-Meteo. Sem necessidade de chave API!
import streamlit as st import requests st.title("🌤️ App de Clima") cidades = { "São Paulo": (-23.55, -46.63), "Rio de Janeiro": (-22.90, -43.17), "Belo Horizonte": (-19.92, -43.94), "Brasília": (-15.78, -47.93) } cidade = st.selectbox("Cidade", list(cidades.keys())) lat, lon = cidades[cidade] url = ( f"https://api.open-meteo.com/v1/forecast?" f"latitude={lat}&longitude={lon}" f"¤t=temperature_2m,weathercode" f"&daily=temperature_2m_max,temperature_2m_min" f"&timezone=America/Sao_Paulo&forecast_days=7" ) with st.spinner("Carregando..."): dados = requests.get(url).json() temp = dados["current"]["temperature_2m"] st.metric(f"🌡️ {cidade} agora", f"{temp}°C")
Interface de chat usando session_state para histórico + integração com API de IA.
pip install openai
import streamlit as st st.title("💬 Chatbot") if "msgs" not in st.session_state: st.session_state.msgs = [] # Exibir histórico for m in st.session_state.msgs: with st.chat_message(m["role"]): st.write(m["content"]) # Input do usuário if prompt := st.chat_input("Mensagem..."): st.session_state.msgs.append( {"role": "user", "content": prompt} ) with st.chat_message("user"): st.write(prompt) # Resposta simples (sem IA externa) resposta = f"Você disse: {prompt}" st.session_state.msgs.append( {"role": "assistant", "content": resposta} ) with st.chat_message("assistant"): st.write(resposta)
Tudo que você precisa para programar no celular
# Atualizar tudo pkg update && pkg upgrade -y # Python + ferramentas pkg install python git nano -y # Pip atualizado pip install --upgrade pip # Streamlit + libs essenciais pip install streamlit pandas numpy matplotlib plotly requests # Verificar python --version streamlit --version
# Opção 1: nano (mais simples) nano app.py # Ctrl+S salvar · Ctrl+X sair # Opção 2: vim (avançado) pkg install vim -y vim app.py # :wq para salvar e sair # Opção 3: usar editor externo # Instale "Acode" ou "AIDE" na Play Store # Edite os arquivos em ~/meu_app/
# Rodar app streamlit run app.py # Porta específica streamlit run app.py --server.port 8502 # Sem abertura automática do browser streamlit run app.py --server.headless true # Ver processos rodando ps aux | grep streamlit # Matar processo pkill -f streamlit # Listar arquivos ls -la # Criar pasta de projeto mkdir ~/projetos && cd ~/projetos
pip install nome_do_modulopip install pandas plotly streamlit
streamlit run app.py --server.port 8502# Criar estrutura de projeto mkdir -p ~/streamlit_curso/{modulo01,modulo02,modulo03,projetos} cd ~/streamlit_curso # Criar arquivo de aula nano modulo01/aula01_texto.py # Rodar aula streamlit run modulo01/aula01_texto.py