Intermédiaire

Mise en page et organisation

Streamlit fournit plusieurs outils de mise en page : sidebar, colonnes, conteneurs, expanders et applications multi-pages.

Sidebar

La sidebar accueille les filtres globaux du dashboard. Elle reste visible quelle que soit la section affichée.

python
with st.sidebar:
    st.header("Filtres")
    st.divider()

    regions = ["Toutes"] + repo.get_regions()
    region = st.selectbox("Région", options=regions)

    annee = st.slider("Année", min_value=2020, max_value=2024, value=2024)

Les valeurs retournées (region, annee) sont utilisables dans le reste du script exactement comme si les widgets étaient dans le corps principal. La seule différence est leur positionnement visuel dans la sidebar.

Quand utiliser la sidebar ?

Placez dans la sidebar les filtres qui s'appliquent à l'ensemble du dashboard (région, année, catégorie). Les filtres spécifiques à une section particulière peuvent rester dans le corps principal, à proximité du contenu qu'ils contrôlent.

Colonnes et conteneurs

st.columns()

st.columns() divise horizontalement l'espace disponible. On passe soit un entier (colonnes égales), soit une liste de ratios :

python
# 3 colonnes égales
col1, col2, col3 = st.columns(3)

# Colonne large + deux étroites
col_main, col_right1, col_right2 = st.columns([3, 1, 1])

Chaque colonne est un contexte dans lequel on place des composants avec le mot-clé with :

python
col1, col2 = st.columns(2)

with col1:
    st.subheader("Tableau des ventes")
    st.dataframe(df_ventes)

with col2:
    st.subheader("Graphique")
    st.bar_chart(df_regions)

Que produit st.columns([3, 1, 1]) ?

st.container()

st.container() regroupe des éléments sans effet visuel. Utile pour écrire dans une zone définie plus tôt dans le script :

python
placeholder = st.container()

# ... plus loin dans le script ...
with placeholder:
    st.write("Ce contenu apparaît à la position du container")

st.expander()

st.expander(label) crée une section repliable, masquée par défaut. L'utilisateur clique pour la déployer. Utile pour les détails techniques ou les données brutes :

python
with st.expander("Voir les données brutes"):
    st.dataframe(df_raw)

Comportement par défaut

Un st.expander() est replié par défaut. Pour l'afficher déplié dès le chargement, passez expanded=True en paramètre.

st.divider()

st.divider() insère une ligne de séparation horizontale entre les sections.

Applications multi-pages

Streamlit supporte les applications multi-pages depuis la version 1.10 :

app.py           # page d'accueil (obligatoire)
pages/
├── 1_Ventes.py
├── 2_Clients.py
└── 3_Export.py

Les fichiers dans le dossier pages/ apparaissent automatiquement dans la sidebar comme liens de navigation. Le préfixe numérique détermine l'ordre d'affichage. Les underscores dans le nom de fichier deviennent des espaces dans le menu : 1_Ventes.py apparaît comme « 1 Ventes ».

Chaque fichier de page est un script Streamlit autonome : il peut importer le repository, définir ses propres widgets, utiliser le cache, etc.

Fichier principal obligatoire

Le fichier app.py à la racine est la page d'accueil de l'application. Il doit exister, même s'il ne contient que la configuration de la page et un titre. Les fichiers dans pages/ sont les pages secondaires.

Comment Streamlit détermine-t-il l'ordre des pages dans la sidebar ?

Configuration de l'application

Fichier .streamlit/config.toml

Le fichier .streamlit/config.toml à la racine du projet permet de personnaliser l'apparence et le comportement de l'application :

toml
[theme]
primaryColor = "#1f77b4"
backgroundColor = "#ffffff"
secondaryBackgroundColor = "#f0f2f6"
textColor = "#262730"

[server]
port = 8501

st.set_page_config()

st.set_page_config() définit le titre de l'onglet, l'icône et le layout.

Contrainte critique

st.set_page_config() doit être le premier appel Streamlit du script, avant tout autre st.*. Le placer après un autre composant lève une StreamlitAPIException.

python
import streamlit as st

# Premier appel obligatoire
st.set_page_config(
    page_title="Dashboard Ventes",
    page_icon="📊",
    layout="wide"          # "centered" (défaut) ou "wide"
)

# Tout le reste ensuite
st.title("Dashboard Ventes")

Le paramètre layout accepte deux valeurs :

ValeurComportementUsage
"centered"Contenu centré dans une colonne étroiteArticles, formulaires
"wide"Contenu sur toute la largeur de la fenêtreDashboards (recommandé)

layout="wide" est le choix habituel pour un dashboard : toute la largeur de la fenêtre est utilisée.

À retenir

Points clés

  • La sidebar (st.sidebar) accueille les filtres globaux
  • st.columns() divise l'espace horizontalement, avec des ratios optionnels
  • st.expander() crée une section repliable (repliée par défaut)
  • Le dossier pages/ active le multi-pages automatiquement dans la sidebar
  • st.set_page_config() doit être le premier appel Streamlit du script
  • layout="wide" est recommandé pour les dashboards