📱 Otimizado para Termux · Mobile First

Streamlit
Academy

Curso completo do zero ao avançado com exercícios, exemplos reais e material didático profissional.

8
Módulos
40+
Exercícios
100%
Termux OK
Real
Projetos - Claudio Marinho
00
Configuração no Termux
Ambiente, instalação e primeiro app
📱 Comandos Termux — Execute no seu terminal
BASH
# 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
🚀 Primeiro App (app.py)
PYTHON
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}! 👋")
▶ Como Executar
BASH
# Rodar o app
streamlit run app.py

# Abrir no navegador do celular:
# http://localhost:8501
💡 Dica Termux Use o navegador do seu celular e acesse localhost:8501. O app atualiza automaticamente quando você salva o arquivo!
🏠 Tarefa de Casa MÓDULO 00
  1. Instale Streamlit no Termux seguindo os comandos acima
  2. Crie o arquivo app.py e execute-o com sucesso
  3. Modifique o app para exibir também a sua idade após digitar o nome
  4. Desafio: Adicione uma mensagem diferente para diferentes nomes digitados
01
Elementos de Texto e Layout
st.write, markdown, colunas, sidebar
📝 Elementos de Texto

Streamlit oferece várias funções para exibir texto com diferentes estilos e níveis hierárquicos.

PYTHON
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")
📐 Layout com Colunas
PYTHON
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!")
📦 Container e Tabs
PYTHON
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")
🏠 Tarefa de Casa MÓDULO 01
  1. Crie uma página com título, cabeçalho e pelo menos 3 parágrafos usando markdown
  2. Adicione uma sidebar com seu nome e uma descrição do app
  3. Crie um layout de 3 colunas exibindo nome, idade e cidade
  4. Use st.tabs() para criar 3 abas: "Sobre Mim", "Hobbies" e "Contato"
  5. Desafio: Crie um mini currículo usando todos os elementos aprendidos
02
Widgets de Entrada
Inputs, botões, sliders, selects
🎛️ Todos os Widgets
PYTHON
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}")
ℹ️ Como os Widgets Funcionam Cada widget retorna um valor. Quando o usuário interage, o Streamlit re-executa o script inteiro com os novos valores. É simples e poderoso!
🧮 Projeto Prático — Calculadora IMC
PYTHON — calculadora_imc.py
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")
🏠 Tarefa de Casa MÓDULO 02
  1. Reproduza a calculadora de IMC acima e teste no Termux
  2. Crie um formulário de cadastro com: nome, email, cidade (select), data de nascimento e um checkbox de aceite
  3. Crie uma calculadora de conversão: °C para °F usando slider
  4. Desafio: Crie um app de enquete com st.radio() e exiba os resultados em tempo real com st.metric()
03
Gráficos e Visualização
Matplotlib, Plotly, gráficos nativos
📱 Instalar bibliotecas
BASH
pip install matplotlib plotly pandas numpy
📊 Gráficos Nativos (mais simples)
PYTHON
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"))
📈 Plotly (interativo)
PYTHON
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)
🏠 Tarefa de Casa MÓDULO 03
  1. Crie um dashboard com gráfico de linha mostrando temperatura dos últimos 7 dias (invente os dados)
  2. Use st.slider() para filtrar o período exibido no gráfico
  3. Adicione um gráfico de barras comparando duas variáveis
  4. Desafio: Crie um app onde o usuário digita valores e o gráfico atualiza em tempo real
04
Pandas & DataFrames
Tabelas, filtros, upload de dados
🗃️ Exibindo DataFrames
PYTHON
import 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)
🔍 Filtros Interativos
PYTHON — app_filtros.py
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)
📤 Upload de Arquivo CSV
PYTHON
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))
🏠 Tarefa de Casa MÓDULO 04
  1. Crie um app com tabela de 10 produtos com preço, categoria e estoque
  2. Adicione filtros por faixa de preço e por categoria
  3. Mostre métricas: total de produtos, preço médio, produto mais caro
  4. Desafio: Implemente busca por texto no nome do produto usando st.text_input() + str.contains()
05
Session State & Reatividade
Estado, callbacks, formulários
🧠 Conceito Fundamental Streamlit re-executa o script inteiro cada vez que o usuário interage. O st.session_state permite persistir dados entre essas execuções.
💾 Session State Básico
PYTHON
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
🛒 Projeto Prático — Carrinho de Compras
PYTHON — carrinho.py
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()
🏠 Tarefa de Casa MÓDULO 05
  1. Implemente o carrinho de compras acima e teste
  2. Adicione a funcionalidade de remover itens individuais
  3. Crie um app de quiz com 3 perguntas usando session_state para guardar respostas e calcular pontuação final
  4. Desafio: Crie um app de lista de tarefas (To-Do List) com adicionar, marcar como feito e deletar
06
APIs e Dados Externos
Requests, JSON, cache, tempo real
📱 Instalar no Termux
BASH
pip install requests
🌐 Consumindo API com Cache
PYTHON — api_pokemon.py
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!")
⏱️ Auto-atualização (Real-time)
PYTHON
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)
🏠 Tarefa de Casa MÓDULO 06
  1. Implemente a Pokédex e adicione uma tabela com todos os golpes do Pokémon
  2. Crie um app que busca cotação do dólar em uma API pública
  3. Use @st.cache_data para evitar chamadas repetidas
  4. Desafio: Crie um dashboard de clima usando a API Open-Meteo (gratuita, sem chave)
07
Projeto Final — Dashboard Completo
App profissional, multipage, deploy
📁 Estrutura Multipage
ESTRUTURA DE PASTAS
meu_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
🏆 Dashboard Financeiro Completo
PYTHON — app.py (PROJETO FINAL)
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)
☁️ Deploy Gratuito no Streamlit Cloud
BASH — Passos para Deploy
# 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!
🏆 Projeto Final CONCLUSÃO

Crie um dos seguintes projetos completos:

  1. 📊 Dashboard de Vendas: Dados CSV + filtros + 3 gráficos + KPIs + exportar
  2. 🌤️ App de Clima: API real + previsão + gráficos + mapa
  3. 🎮 Pokédex Avançada: Busca + comparação + favoritos + session state
  4. 📝 App de Finanças Pessoais: Registrar gastos + categorias + relatórios mensais
  5. 🤖 Chatbot Simples: Interface de chat com session state + respostas pré-programadas

⚡ Cheatsheet Streamlit

FunçãoUso
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
WidgetRetorna
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
LayoutComo usar
st.columns(n)c1,c2 = st.columns(2)
st.tabs()t1,t2 = st.tabs(["A","B"])
st.sidebarst.sidebar.write()
st.expander()with st.expander("+")
st.container()with st.container()
st.empty()placeholder atualizável
🔑 Padrões Essenciais
PYTHON
# 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="🚀"
)

🚀 Galeria de Projetos

Projetos completos para praticar todos os conceitos

P1
🧮 Calculadora Científica
Módulos 01-02 · Iniciante

Operações básicas, trigonométricas e logarítmicas com histórico de cálculos usando session_state.

st.buttonsession_statest.columnsmath
P2
📈 Análise de Ações
Módulos 03-04 · Intermediário

Dashboard de ações com gráfico de candlestick, médias móveis e indicadores técnicos.

yfinanceplotlypandasst.cache_data
BASH · Instalar
pip install yfinance plotly
P3
🌤️ App de Clima
Módulo 06 · Intermediário

Clima em tempo real usando a API gratuita Open-Meteo. Sem necessidade de chave API!

PYTHON — clima.py
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")
P4
🤖 Chatbot com IA
Módulo 07 · Avançado

Interface de chat usando session_state para histórico + integração com API de IA.

📱 Instalar
BASH
pip install openai
PYTHON — chatbot.py
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)

📱 Guia Completo Termux

Tudo que você precisa para programar no celular

🔧 Setup Inicial Completo
BASH — Execute estes comandos primeiro
# 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
📝 Editor de Código no Termux
BASH
# 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/
⚡ Comandos Mais Usados
BASH
# 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
💡 Dica Pro Abra o navegador e acesse http://localhost:8501. Mantenha tanto o Termux quanto o navegador abertos. Use "dividir tela" do Android para ver os dois ao mesmo tempo!
⚠️ Problema: ModuleNotFoundError Se aparecer erro de módulo: pip install nome_do_modulo
Ex: pip install pandas plotly streamlit
⚠️ Problema: Porta em uso Execute: streamlit run app.py --server.port 8502
Depois acesse: localhost:8502
🗂️ Estrutura de Pastas Recomendada
BASH
# 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
Progresso do Curso 0%