Você chegou no último capítulo. Hoje seu programa sai do terminal preto e ganha uma telinha bonita no navegador — sem HTML, sem CSS, sem JavaScript. 100% Python. Bora encerrar o bootcamp em grande estilo? 🎉
No capítulo passado você aprendeu a guardar dados com o TinyDB — eles ficam salvos mesmo quando o programa fecha. Show. Mas tem um detalhe…
Tudo isso ainda roda no terminal preto. Quem vai usar seu sistema? Sua mãe? Seu chefe? Um cliente? Eles abririam um terminal e digitariam comandos? Provavelmente não.
E se a gente pudesse ter UMA TELINHA BONITA no navegador — com botões, campos, tabelas — sem precisar aprender HTML, CSS ou JavaScript? É exatamente o que o Streamlit faz, em poucas linhas. ✨
Sistema de cadastro no terminal, salvando no TinyDB.
Mesmo sistema, agora com interface bonita no navegador.
Pensa num tradutor mágico: você fala em Python, e ele entrega uma página web bonita do outro lado. Sem você precisar saber HTML, CSS ou JavaScript — só Python. É isso. Literalmente.
Cada função do Streamlit (tipo st.title, st.button)
aparece como um elemento visual no navegador. Você empilha funções, ele empilha
elementos. Pronto — você fez um app.
Pra usar o Streamlit, precisa instalar uma vez (igual a gente fez com o tinydb).
Depois é só rodar com streamlit run.
# 1) Instalar (você só faz isso UMA vez) pip install streamlit # 2) Rodar o app (sempre que quiser usar) streamlit run app.py
python app.py!
É streamlit run app.py.
Se você rodar com python, o Streamlit não abre o navegador
e parece que nada aconteceu. (BugZilla adora esse erro 🐛)
streamlit run app.py:
localhost:8501Ctrl + C no terminalVamos passar pelos componentes principais. Cada um a gente vê o código + uma simulação de como fica no navegador. Olha que mágica!
Cria um arquivo app_texto.py e digita o código abaixo. Depois roda
com streamlit run app_texto.py e olha o navegador. 🎉
import streamlit as st st.title("🏪 Meu Primeiro App!") st.header("Sobre mim") st.write("Olá, mundo! Agora com interface gráfica! 🎨")
Olá, mundo! Agora com interface gráfica! 🎨
st.title() = título grande,
st.header() = subtítulo,
st.write() = texto normal (igual print, mas bonito).
input()?
O st.text_input() é a mesma ideia do input() que você
já usou — só que aparece como uma caixinha bonita no navegador.
E o st.number_input() já cuida da conversão pra número
(você não precisa de int()).
import streamlit as st st.title("📋 Cadastro") nome = st.text_input("Qual seu nome?") idade = st.number_input("Sua idade:", min_value=0) st.write(f"Olá {nome}, você tem {int(idade)} anos!")
Olá Kelson, você tem 33 anos!
O st.button("Clique") retorna True quando o usuário clica
e False quando não. É o mesmo if que você já conhece
— só que a "condição" agora é um botão visual.
import streamlit as st st.title("Botão Mágico") if st.button("Clique aqui!"): st.write("Você clicou! 🎉")
(depois do clique, aparece: "Você clicou! 🎉")
Em vez de só usar st.write, você pode dar cor e ênfase
às mensagens — feedback visual instantâneo:
import streamlit as st st.success("✅ Deu certo!") st.error("❌ Algo deu errado!") st.info("ℹ️ Só uma informação.") st.warning("⚠️ Cuidado!")
print com superpoderes —
o usuário entende o que aconteceu só pela cor.
if/elif?No terminal a gente fazia menu numérico: "1) Cadastrar 2) Listar 3) Sair" e o usuário digitava o número. Com Streamlit, isso vira um dropdown clicável. Bem mais bonito!
import streamlit as st fruta = st.selectbox("Escolha uma fruta:", ["Maçã", "Banana", "Uva"]) gosta = st.checkbox("Gosto muito!") nota = st.slider("De 0 a 10, quanto?", 0, 10, 5) st.write(f"Fruta: {fruta}") st.write(f"Gosta? {gosta}") st.write(f"Nota: {nota}")
Fruta: Maçã
Gosta? True
Nota: 8
Lembra do for + print que a gente fazia pra listar uma lista de dicionários? Com Streamlit é uma linha:
import streamlit as st st.title("👥 Minha Turma") turma = [ {"nome": "Ana", "idade": 22, "curso": "Python"}, {"nome": "João", "idade": 25, "curso": "Java"}, {"nome": "Maria", "idade": 20, "curso": "JS"}, ] st.table(turma) st.metric("Total de alunos", len(turma))
| nome | idade | curso |
|---|---|---|
| Ana | 22 | Python |
| João | 25 | Java |
| Maria | 20 | JS |
st.metric mostra um número em destaque — perfeito pra
dashboards (faturamento, total de vendas, etc). E st.dataframe é parecido
com st.table, mas permite ordenação e filtro direto pelo usuário.
Quando o app cresce, você precisa organizar. As ferramentas:
st.tabs([...]) — divide em abas clicáveis (igual abas do navegador)st.columns(N) — divide a tela em N colunas lado a ladost.sidebar — gera uma barra lateral (menu, filtros, etc)import streamlit as st st.title("Dashboard de Vendas") aba1, aba2 = st.tabs(["📦 Produtos", "📊 Vendas"]) with aba1: st.write("Conteúdo dos produtos…") with aba2: col1, col2 = st.columns(2) col1.metric("Vendas", 42) col2.metric("Faturamento", "R$ 1.250")
with aba1: diz: "tudo o que estiver indentado aqui dentro vai pra aba 1".
Mesmo padrão do with que você viu pra abrir arquivos no Cap. 08! 😉
Streamlit não é uma linguagem nova. É o mesmo Python que você já conhece, com funções extras que geram interface. Olha o de/para:
| No terminal você fazia… | No Streamlit é… | O que faz |
|---|---|---|
print("Olá!") | st.write("Olá!") | Mostra texto |
print("=== TÍTULO ===") | st.title("TÍTULO") | Título grande |
nome = input("Nome: ") | nome = st.text_input("Nome:") | Pega texto |
idade = int(input("Idade: ")) | idade = st.number_input("Idade:") | Pega número |
if input("ok? ") == "s": | if st.button("OK"): | Decisão por clique |
print("✅ ok") | st.success("✅ ok") | Mensagem verde |
for x in lista: print(x) | st.table(lista) | Tabela formatada |
menu numérico com if/elif | st.selectbox("...", [...]) | Dropdown |
| "separe em seções no código" | st.tabs([...]) | Abas visuais |
Sério. Tudo que você aprendeu nos 9 capítulos anteriores continua valendo. O Streamlit só troca a "roupa" da saída e da entrada — a lógica é a mesma de sempre. 🐍
Tá quase no fim do bootcamp, mas o BugZilla ainda dá uma última aparecida 😅. Bora ver os erros mais clássicos com Streamlit — pra você não cair neles:
python em vez de streamlit runpython app.py ❌ → não abre nada, parece que travou.streamlit run app.py ✅ → jeito certo, abre o navegador.
st.title ❌ → não mostra nada, é só uma referência.st.title("Meu App") ✅ → chama de verdade.
key únicost.text_input("Nome") em abas diferentes,
o Streamlit reclama. Solução: dá um key diferente pra cada um —
tipo st.text_input("Nome", key="cad_nome").
st.button("Salvar"):Streamlit pra interface + TinyDB pra dados. É O CLIMAX DO BOOTCAPM! Você junta TUDO que aprendeu num só projeto.
Crie um arquivo app_loja.py. O sistema vai ter 4 abas:
st.table()text_input + number_input + button que faz estoque.insert(...)selectbox com produtos, calcula total, faz vendas.insert(...) e estoque.update(...)st.metric() com faturamento total
Use duas tabelas do TinyDB: estoque e vendas
(igual capítulo 09 — db.table("nome")). Não esqueça de dar key únicos
pra cada input pra não confundir entre as abas. Validação básica:
mostrar st.error() se o nome estiver vazio.
Bônus mago: chama st.balloons() quando registrar uma venda — solta balões na tela. 🎈
from tinydb import TinyDB, where import streamlit as st db = TinyDB("loja.json") estoque = db.table("estoque") vendas = db.table("vendas") st.set_page_config(page_title="Sistema Loja", page_icon="🏪") st.title("🏪 Sistema de Loja") aba_est, aba_cad, aba_ven, aba_hist = st.tabs( ["📦 Estoque", "➕ Cadastrar", "🛒 Vender", "📊 Vendas"] ) # ════ ESTOQUE ════ with aba_est: st.header("Estoque atual") produtos = estoque.all() if len(produtos) == 0: st.info("Estoque vazio. Cadastre um produto na aba ao lado!") else: st.table(produtos) st.metric("Total de produtos", len(produtos)) # ════ CADASTRAR ════ with aba_cad: st.header("Cadastrar produto") nome = st.text_input("Nome", key="cad_nome") preco = st.number_input("Preço (R$)", min_value=0.0, step=0.5, key="cad_preco") qtd = st.number_input("Quantidade", min_value=0, step=1, key="cad_qtd") if st.button("Cadastrar", type="primary"): if nome.strip() == "": st.error("Digite o nome!") else: estoque.insert({ "nome": nome, "preco": float(preco), "qtd": int(qtd) }) st.success(f"✅ '{nome}' cadastrado!") st.rerun() # ════ VENDER ════ with aba_ven: st.header("Registrar venda") produtos = estoque.all() if len(produtos) == 0: st.info("Sem produtos pra vender.") else: nomes = [p["nome"] for p in produtos if p["qtd"] > 0] if len(nomes) == 0: st.warning("Tudo zerado!") else: escolhido = st.selectbox("Produto", nomes, key="v_prod") qtd_v = st.number_input("Qtd", min_value=1, step=1, key="v_qtd") cliente = st.text_input("Cliente", key="v_cli") produto = estoque.get(where("nome") == escolhido) total = produto["preco"] * qtd_v st.info(f"💰 Total: R$ {total:.2f}") if st.button("Confirmar venda", type="primary"): vendas.insert({ "produto": escolhido, "qtd": int(qtd_v), "total": total, "cliente": cliente }) estoque.update( {"qtd": produto["qtd"] - int(qtd_v)}, where("nome") == escolhido ) st.success("✅ Venda registrada!") st.balloons() st.rerun() # ════ HISTÓRICO ════ with aba_hist: st.header("Histórico de vendas") lista = vendas.all() if len(lista) == 0: st.info("Sem vendas ainda.") else: st.table(lista) soma = sum(v["total"] for v in lista) col1, col2 = st.columns(2) col1.metric("Total de vendas", len(lista)) col2.metric("Faturamento", f"R$ {soma:.2f}")
pip install streamlit tinydb (uma vez só) e
depois streamlit run app_loja.py. Cadastra produtos, vende, fecha o terminal,
abre de novo — os dados continuam lá! É TinyDB salvando no loja.json. 🎉
Para de tudo um segundo. Olha o que você aprendeu nesses 10 capítulos:
print · input · primeiras linhas em Python
if · elif · else · operadores
while · for · range · listas
def · parâmetros · retorno · reutilização
json.dump · json.load · primeiro "save"
Pegar uma ideia → quebrar em passos → traduzir pra Python → guardar dados num arquivo → mostrar tudo numa interface bonita que qualquer um consegue usar.
Isso é programação completa. Não é "só fundamentos". É um ciclo inteiro de software.
Você começou com um "Olá, mundo!" e terminou com um sistema completo com banco de dados e interface gráfica. Você conseguiu.
"Você é um(a) dev iniciante de verdade agora." 🐍✨
Obrigado por chegar até aqui. Iniciar não é fácil — terminar também não. Você fez os dois. Continua. Refaz os exercícios, quebra eles, conserta. Cria seus projetos a partir desses. O bootcamp acaba aqui — sua jornada como dev tá só começando. 🚀
— prof. Kelson Almeida 🐍