Introducción y entorno de trabajo
2026-04-13
Introducción y Entorno de Trabajo
Python → App Web 🚀
🏆 Más de 30 millones de apps creadas · Usado por Google, Airbnb, Uber, NASA
💡 Recomendado: Crea un entorno virtual primero → python -m venv venv → source venv/bin/activate
Luego verificar: streamlit --version → debería mostrar la versión instalada
import streamlit as st
st.title("¡Hola, Streamlit! 🎈")
st.write("Mi primera app en Python.")
streamlit run--server.port 8502 — cambiar el puerto--server.headless true — no abrir el browser--logger.level debug — ver más logsDe arriba → abajo, siempre 🔄
st.session_state)
st.title() · st.header() · st.subheader()import streamlit as st
st.title("Título Principal")
# Argumento: texto (str)
# Nivel H1 — el más grande
st.header("Sección")
# Argumento: texto (str)
# Nivel H2 — para secciones
st.subheader("Subsección")
# Argumento: texto (str)
# Nivel H3 — para subsecciones
Los tres aceptan anchor (para links internos) y help (tooltip). Ej: st.title("App", anchor="inicio")
st.write() — el comando todo-en-unost.text() · st.markdown() · st.caption()st.text("Texto plano sin formato.")
# Argumento: body (str)
# Sin markdown — literal
st.markdown("**Negrita**, *cursiva*, `código`")
# Argumento: body (str)
# unsafe_allow_html=True → HTML directo
st.caption("Nota al pie o aclaración")
# Argumento: body (str)
# Texto pequeño y gris — ideal para
# fuentes, notas y aclaraciones
códigost.code() · st.divider()st.code("""
def saludar(nombre):
return f"Hola, {nombre}!"
""", language="python")
# language: "python","sql","bash","json"...
# line_numbers=True → muestra nros de línea
st.divider()
# Sin argumentos
# Solo dibuja una línea separadora
# Equivalente a st.markdown("---")
st.button()clicked = st.button(
label="Haz clic aquí", # texto del botón (str) *obligatorio*
key="mi_boton", # ID único (str) — necesario si hay varios
help="Tooltip al hover",# texto de ayuda (str)
type="primary", # "primary" (azul) o "secondary" (gris)
disabled=False, # deshabilitar (bool)
use_container_width=True# ancho completo (bool)
)
if clicked:
st.write("¡Botón presionado! 🎉")
True solo en la ejecución inmediatamente posterior al clickFalsest.session_statest.checkbox() · st.text_input()activo = st.checkbox(
label="Activar opción",
value=False, # estado inicial (bool)
key="check1", # ID único
help="Ayuda", # tooltip
disabled=False # deshabilitar
)
# Devuelve True/False
texto = st.text_input(
label="Escribe algo",
value="", # valor inicial (str)
max_chars=100, # máx caracteres (int)
key="input1", # ID único
type="default", # "default" o "password"
placeholder="..." # texto fantasma
)
# Devuelve el string escrito
st.number_input() · st.slider()num = st.number_input(
label="Edad",
min_value=0, # mínimo (int/float)
max_value=120, # máximo (int/float)
value=25, # valor inicial
step=1, # incremento
format="%d", # formato de display
key="num1"
)
# Devuelve int o float
25val = st.slider(
label="Temperatura",
min_value=0, # mínimo
max_value=100, # máximo
value=50, # inicial (o tupla para rango)
step=1, # paso
format="%d°C", # formato del label
key="slider1"
)
# value=(20,80) → slider de rango
50°Cst.success("Operación exitosa ✅")st.error("Algo salió mal ❌")st.warning("Cuidado ⚠️")st.info("Para tu información 💡")body (str) — el mensaje
·
icon (str) — emoji o None
·
expanded (bool) — colapsable si es largo
st.balloons() · st.spinner()if st.button("Celebrar"):
st.balloons()
# Sin argumentos
# Lanza una animación de globos
# Perfecto para onboarding y logros
with st.spinner("Procesando..."):
time.sleep(2) # simulación
resultado = calcular()
# text (str): mensaje del spinner
# Se usa como context manager (with)
# Mientras dura el bloque → spinner activo
st.columns()col1, col2, col3 = st.columns(3)
# Argumento 1: n_columns (int) o lista de pesos
# st.columns([2, 1, 1]) → primera columna más ancha
# gap="small"/"medium"/"large" — espacio entre cols
with col1:
st.metric("Ventas", "$ 1,234")
with col2:
st.metric("Clientes", "89")
with col3:
st.metric("Conversión", "7.2%")
st.expander() · st.container()with st.expander("Ver detalles"):
# label: texto del header (str)
# expanded=False: cerrado por defecto
# Ideal para: configs, logs,
# información secundaria
st.write("Contenido oculto...")
st.code("print('dentro!')")
with st.container():
# Sin argumentos obligatorios
# border=True → borde visible
# height=300 → altura fija + scroll
# Agrupa widgets lógicamente
st.write("Elemento 1")
st.write("Elemento 2")
# Útil para agrupar, aplicar
# estilos o controlar layout
st.image() · st.video()st.image(
image, # path, URL, PIL, numpy
caption="Texto", # pie de imagen (str)
width=300, # ancho en px
use_column_width=True, # 100% ancho
clamp=False, # clamp de píxeles
channels="RGB", # "RGB" o "BGR"
output_format="auto" # "JPEG","PNG","auto"
)
st.video(
data, # URL, path local, bytes
format="video/mp4", # MIME type
start_time=0, # segundo de inicio
subtitles=None # subs VTT o dict
)
# ✓ URLs de YouTube
# ✓ Archivos .mp4 / .webm
# ✓ bytes en memoria
import streamlit as st
st.title("🎛️ Mi App de Demostración")
st.divider()
# Sección de inputs
col1, col2 = st.columns(2)
with col1:
st.header("Configuración")
nombre = st.text_input("Tu nombre", placeholder="Ej: Ana")
edad = st.slider("Edad", 1, 100, 25)
activo = st.checkbox("Modo avanzado")
with col2:
st.header("Controles")
nivel = st.number_input("Nivel", 1, 10, 1)
if st.button("Generar", type="primary"):
st.balloons()
st.divider()
# Sección de output — reacciona a los inputs
if nombre:
st.success(f"¡Hola {nombre}! Tienes {edad} años.")
if activo:
with st.expander("Detalles avanzados"):
st.info(f"Nivel configurado: {nivel}")
st.code(f"usuario = dict(nombre='{nombre}', edad={edad})")
else:
st.warning("Ingresa tu nombre para comenzar.")
st.write(f"Hola {nombre}") # ← ERROR
# nombre no existe todavía!
nombre = st.text_input("Nombre")
nombre = st.text_input("Nombre")
# ↑ primero definimos el widget
if nombre:
st.write(f"Hola {nombre}") # ✅
El scripting flow garantiza que el código se lee como un libro: de arriba a abajo. Primero defines, luego usas.
import streamlit as st
st.title("Mi Primera App 🎈")
st.write("¡Está funcionando!")
nombre = st.text_input("¿Cómo te llamas?")
edad = st.slider("¿Cuántos años tienes?", 1, 100, 25)
if nombre:
st.success(f"¡Bienvenido/a, {nombre}! Tienes {edad} años. 🎉")
st.balloons()
else:
st.info("Escribe tu nombre arriba 👆")
¡A construir! 🚀
Módulo 1 — Completado
Preguntas antes de cerrar 🙋
Módulo 1 · Streamlit · Introducción y Entorno de Trabajo