st.selectbox, st.multiselect, st.radio, st.pills y st.segmented_control

Básico
Streamlit
Streamlit
Actualizado: 26/04/2026

st.selectbox: selector desplegable de una opción

st.selectbox genera una lista desplegable que permite al usuario elegir una sola opción de entre un conjunto predefinido. Es el selector más utilizado en dashboards para filtrar datos por categoría, seleccionar modelos, elegir períodos temporales y cualquier escenario donde se necesite una selección única de una lista cerrada.

El valor devuelto es directamente el elemento seleccionado de la lista (no su índice), lo que simplifica el uso posterior en filtros y condiciones:

import streamlit as st
import pandas as pd

# Selectbox básico con lista de opciones
algoritmo = st.selectbox(
    "Algoritmo de clasificación",
    ["Random Forest", "XGBoost", "SVM", "Regresión logística", "KNN"],
    index=0,  # Opción seleccionada por defecto (índice 0 = primera)
    help="Elige el algoritmo que deseas entrenar"
)
st.write(f"Algoritmo seleccionado: **{algoritmo}**")

# Selectbox con opción vacía/nula
pais = st.selectbox(
    "País de origen",
    [None, "España", "México", "Argentina", "Colombia"],
    format_func=lambda x: "Selecciona un país..." if x is None else x
)

# Selectbox con DataFrame como fuente de opciones
df_productos = pd.DataFrame({"id": [1, 2, 3], "nombre": ["Laptop", "Monitor", "Teclado"]})
producto_id = st.selectbox(
    "Producto",
    df_productos["id"],
    format_func=lambda x: df_productos[df_productos["id"] == x]["nombre"].iloc[0]
)
st.write(f"ID del producto seleccionado: {producto_id}")

El parámetro format_func es especialmente útil cuando las opciones internas (IDs numéricos, códigos, claves) difieren de lo que se quiere mostrar al usuario. La función recibe el valor real y devuelve la cadena que se visualiza en el desplegable.

flowchart TD
    A[Necesidad selección] --> B{"Cuántas opciones?"}
    B -->|Una de muchas| C[st.selectbox dropdown]
    B -->|Varias simultaneas| D[st.multiselect chips]
    B -->|Pocas excluyentes| E[st.radio botones]
    B -->|Compacto multi| F[st.pills compacto]
    B -->|Tipo tabs| G[st.segmented_control]
    C --> H[Devuelve elemento exacto]
    D --> I[Devuelve lista de elementos]
    E --> J[Vertical u horizontal]
    F --> K[Selection_mode multi o single]
    G --> L[Vista compacta de switch]
    H --> M[Filtrado eficiente en pandas]
    I --> M
    J --> M

st.multiselect: selección múltiple

st.multiselect permite al usuario seleccionar una o más opciones de una lista, mostrando las selecciones como etiquetas dentro del campo. Incluye búsqueda integrada que filtra las opciones conforme el usuario escribe, lo que resulta especialmente útil con listas largas:

import streamlit as st

# Selección múltiple básica
columnas = st.multiselect(
    "Columnas a incluir en el análisis",
    ["Edad", "Salario", "Departamento", "Antigüedad", "Rendimiento"],
    default=["Edad", "Salario"]  # Opciones preseleccionadas
)

if columnas:
    st.write(f"Analizando {len(columnas)} columna(s): {', '.join(columnas)}")
else:
    st.warning("Selecciona al menos una columna para continuar.")

# Multiselect con búsqueda (funciona automáticamente con listas largas)
paises = ["España", "Francia", "Alemania", "Italia", "Portugal",
          "Países Bajos", "Bélgica", "Austria", "Suiza", "Polonia"]
seleccionados = st.multiselect("Mercados objetivo", paises, max_selections=3)
if len(seleccionados) == 3:
    st.info("Has alcanzado el límite máximo de 3 mercados.")

st.radio: botones de selección única

import streamlit as st

# Radio vertical (por defecto)
tipo_grafico = st.radio(
    "Tipo de visualización",
    ["Líneas", "Barras", "Área", "Dispersión"],
    index=0
)

# Radio horizontal (compacto)
periodo = st.radio(
    "Período temporal",
    ["7 días", "30 días", "90 días", "1 año"],
    horizontal=True
)

# Radio con captions explicativos
modelo = st.radio(
    "Complejidad del modelo",
    ["Lineal", "Medio", "Alto"],
    captions=[
        "Rápido, interpretable, menos preciso",
        "Balance entre velocidad y precisión",
        "Máxima precisión, más lento y complejo"
    ]
)

st.write(f"Período: **{periodo}** | Modelo: **{modelo}** | Gráfico: **{tipo_grafico}**")

st.pills: etiquetas de selección compactas

st.pills (disponible desde Streamlit 1.36) ofrece una interfaz de selección tipo chips o etiquetas, más compacta visualmente que st.radio. Las opciones se muestran como botones horizontales que cambian de color al seleccionarse, ocupando menos espacio vertical que las alternativas tradicionales:

import streamlit as st

# Selección única con pills
categoria = st.pills(
    "Categoría de datos",
    ["Ventas", "Marketing", "Operaciones", "RRHH", "Finanzas"]
)

# Selección múltiple con pills
etiquetas = st.pills(
    "Filtrar por etiquetas",
    ["Urgente", "Revisión", "Aprobado", "Pendiente", "Archivado"],
    selection_mode="multi"
)

if etiquetas:
    st.write(f"Filtros activos: {', '.join(etiquetas)}")

st.segmented_control: control segmentado tipo tab compacto

st.segmented_control (Streamlit 1.36+) crea un control de selección visual similar a los botones segmentados de las interfaces móviles:

import streamlit as st

# Modo de vista
vista = st.segmented_control(
    "Vista",
    ["Tabla", "Gráfico", "Ambos"],
    default="Ambos"
)

# Escala temporal para gráficos
escala = st.segmented_control(
    "Escala",
    ["Diario", "Semanal", "Mensual", "Anual"],
    default="Mensual"
)

# Selección múltiple con segmented_control
formatos = st.segmented_control(
    "Formatos de exportación",
    ["CSV", "Excel", "JSON", "PDF"],
    selection_mode="multi",
    default=["CSV"]
)

Ejemplo de dashboard con todos los selectores

import streamlit as st
import pandas as pd
import numpy as np

st.title("Panel de análisis configurable")

with st.sidebar:
    st.header("Configuración")

    # Periodo temporal
    periodo = st.radio("Período", ["Semana", "Mes", "Trimestre", "Año"], horizontal=False)

    # Mercados
    mercados = st.multiselect(
        "Mercados",
        ["España", "Portugal", "Francia", "Alemania"],
        default=["España"]
    )

    # Tipo de análisis
    analisis = st.selectbox("Tipo de análisis", ["Ventas", "Costes", "Margen", "ROI"])

# Vista principal
vista = st.segmented_control("Visualización", ["Gráfico", "Tabla", "Comparativa"], default="Gráfico")

if not mercados:
    st.warning("Selecciona al menos un mercado en el panel lateral.")
else:
    df = pd.DataFrame(
        np.random.randn(10, len(mercados)),
        columns=mercados
    )
    if vista == "Gráfico":
        st.line_chart(df)
    elif vista == "Tabla":
        st.dataframe(df, use_container_width=True)
    else:
        col1, col2 = st.columns(2)
        with col1:
            st.line_chart(df)
        with col2:
            st.dataframe(df)
Alan Sastre - Autor del tutorial

Alan Sastre

Ingeniero de Software y formador, CEO en CertiDevs

Ingeniero de software especializado en Full Stack y en Inteligencia Artificial. Como CEO de CertiDevs, Streamlit es una de sus áreas de expertise. Con más de 15 años programando, 6K seguidores en LinkedIn y experiencia como formador, Alan se dedica a crear contenido educativo de calidad para desarrolladores de todos los niveles.

Más tutoriales de Streamlit

Explora más contenido relacionado con Streamlit y continúa aprendiendo con nuestros tutoriales gratuitos.

Aprendizajes de esta lección

Implementar listas desplegables con st.selectbox para selección única. Usar st.multiselect para permitir la selección de múltiples opciones. Crear grupos de radio con st.radio en orientación horizontal y vertical. Aplicar st.pills para selección compacta tipo etiqueta con múltiples valores. Usar st.segmented_control para alternativas de interfaz tipo tabs compactos.