こんにちは、JS2IIUです。
2026年3月31日にリリースされた Streamlit 1.56.0 は、新しいウィジェット2本の追加、st.dataframe の大幅強化、チャット系コンポーネントの改善など、多岐にわたるアップデートを含む大型リリースです。この記事では、実際に動作するコードサンプルを交えながら、注目すべき変更点を網羅的に解説します。今回もよろしくお願いします。
1. はじめに
Streamlit は Python だけでインタラクティブなWebアプリを構築できるフレームワークです。データ分析の結果をすぐに可視化したいエンジニアや、機械学習モデルのデモを手軽に公開したい研究者に広く使われています。
1.56.0 のアップデートは大きく3つの方向性に集約されます。
- 新しいウィジェットの追加 —
st.menu_buttonとst.iframeにより、アプリの表現力が向上 - データ表示の強化 —
st.dataframeが多数の新パラメータを獲得し、インタラクティブ性が飛躍的に向上 - AI/チャットアプリ対応の改善 —
st.chat_inputや streaming Markdown の改善でLLMアプリ開発がよりスムーズに
まずはアップグレードから始めましょう。
pip install --upgrade streamlit2. ハイライト:新しいウィジェット3本
2-1. st.menu_button — ドロップダウンメニュー
st.menu_button は、クリックするとポップオーバーを表示するドロップダウンボタンです。ツールバーや設定メニュー、アクションリストの構築に適しています。
以下の処理フローでウィジェットが動作します。

import streamlit as st
# メニューボタンの基本的な使い方
clicked = st.menu_button(
"操作を選択",
options=["データをリロード", "CSVをエクスポート", "設定を開く"],
icon=":material/settings:",
)
if clicked == "データをリロード":
st.session_state["reload"] = True
elif clicked == "CSVをエクスポート":
st.session_state["export"] = True
elif clicked == "設定を開く":
st.session_state["open_settings"] = True
# セッション状態に応じた処理
if st.session_state.get("reload"):
st.success("データをリロードしました")
if st.session_state.get("export"):
st.info("エクスポートを開始します")
ポップオーバー内には st.button だけでなく、st.selectbox や st.slider など任意のウィジェットを配置できます。複雑な設定パネルをコンパクトにまとめたいときに特に有効です。
2-2. st.iframe — 外部コンテンツの埋め込み
st.iframe を使うと、外部URLや生のHTMLコンテンツをiframeとして直接アプリに埋め込めます。これまで st.components.v1.iframe を使っていた処理が、よりシンプルに書けるようになりました。
import streamlit as st
st.subheader("外部URLの埋め込み")
# 外部WebページをiFrameで表示
st.iframe(
src="https://example.com",
height=500,
)
st.subheader("生HTMLの埋め込み")
# HTMLを直接記述して埋め込む
html_content = """
<html>
<body style="font-family: sans-serif; padding: 20px;">
<h2>カスタムHTMLコンテンツ</h2>
<canvas id="myCanvas" width="200" height="100"
style="border: 1px solid #ccc;"></canvas>
<script>
const canvas = document.getElementById("myCanvas");
const ctx = canvas.getContext("2d");
ctx.fillStyle = "steelblue";
ctx.fillRect(10, 10, 180, 80);
</script>
</body>
</html>
"""
st.iframe(html_content, height=200)
地図の埋め込みや、外部ダッシュボードの表示、JavaScriptを活用したカスタムビジュアライゼーションなど、用途は幅広いです。
2-3. filter_mode — セレクトウィジェットのフィルター検索
st.selectbox と st.multiselect に filter_mode パラメータが追加されました。オプションが多い場合に、入力した文字列で選択肢を絞り込めます。
import streamlit as st
# 都道府県リスト(47件)から素早く選べるようになる
prefectures = [
"北海道", "青森県", "岩手県", "宮城県", "秋田県",
"山形県", "福島県", "茨城県", "栃木県", "群馬県",
"埼玉県", "千葉県", "東京都", "神奈川県", "新潟県",
# ... 省略
"沖縄県",
]
# filter_mode="contains" で部分一致フィルター
selected = st.multiselect(
"都道府県を選択",
options=prefectures,
filter_mode="contains", # 新パラメータ
)
st.write("選択中:", selected)filter_mode は "default"(既存の動作)と "contains"(部分一致)を選択できます。数百件以上の選択肢を持つプルダウンで特に効果を発揮します。
3. st.dataframe の大幅強化
今回のリリースで最も変更点が多いのが st.dataframe です。インタラクティブ性と表示制御の両面で大きく進化しました。
3-1. プログラムによる選択の制御
selection パラメータで、初期選択状態をコードから指定できるようになりました。
import streamlit as st
import pandas as pd
df = pd.DataFrame({
"商品名": ["りんご", "みかん", "ぶどう", "もも", "なし"],
"価格": [150, 80, 300, 200, 120],
"在庫": [50, 120, 30, 45, 80],
})
# 最初から2行目を選択済みにする
event = st.dataframe(
df,
selection_mode="single-row",
on_select="rerun",
selection_default={"selection": {"rows": [1], "columns": [], "cells": []}}, # 新パラメータ:初期選択行を指定
)
if event.selection["rows"]:
selected_row = df.iloc[event.selection["rows"][0]]
st.write("選択中の商品:", selected_row["商品名"])
3-2. "single-row-required" 選択モード
新しい選択モード "single-row-required" を使うと、常に1行が選択された状態を維持できます。行のクリックで選択を解除できなくなるため、「選択中の行に対して操作を行う」UIパターンが実装しやすくなります。
import streamlit as st
import pandas as pd
df = pd.DataFrame({
"ユーザー": ["Alice", "Bob", "Charlie"],
"スコア": [92, 78, 85],
})
event = st.dataframe(
df,
selection_mode="single-row-required", # 常に1行選択を強制
on_select="rerun",
)
selected_idx = event.selection["rows"][0] # 必ず値が存在する
st.metric("選択中のスコア", df.iloc[selected_idx]["スコア"])3-3. AudioColumn / VideoColumn — メディア列の追加
st.column_config に AudioColumn と VideoColumn が追加されました。dataframe の各セルで音声・動画を直接再生できます。
import streamlit as st
import pandas as pd
df = pd.DataFrame({
"タイトル": ["サンプル音声1", "サンプル音声2"],
"音声ファイル": [
"https://www.soundhelix.com/examples/mp3/SoundHelix-Song-1.mp3",
"https://www.soundhelix.com/examples/mp3/SoundHelix-Song-2.mp3",
],
"解説動画": [
"https://www.w3schools.com/html/mov_bbb.mp4",
"https://www.w3schools.com/html/movie.mp4",
],
})
st.dataframe(
df,
column_config={
"音声ファイル": st.column_config.AudioColumn(
label="再生",
help="クリックで再生",
),
"解説動画": st.column_config.VideoColumn(
label="動画",
),
# alignment パラメータで列の文字揃えを指定
"タイトル": st.column_config.TextColumn(
alignment="center", # 新パラメータ:"left" / "center" / "right"
),
},
)この他、列の表示/非表示を切り替えるメニューが常に表示されるようになり、ユーザーが必要な列だけを自由に選べるようになりました。
4. ナビゲーションの改善
4-1. st.navigation の expanded パラメータ
サイドバーのナビゲーション項目が多い場合、expanded で最初から展開して表示する項目数を制御できます。
import streamlit as st
pages = st.navigation(
{
"分析": [
st.Page("pages/overview.py", title="概要"),
st.Page("pages/detail.py", title="詳細"),
st.Page("pages/analytics.py", title="分析"),
st.Page("pages/report.py", title="レポート"),
],
"設定": [
st.Page("pages/config.py", title="設定"),
st.Page("pages/help.py", title="ヘルプ"),
],
},
# expanded=1: ページ数(6) > 1+3=4 のためメニューが折りたたまれ、
# 最初の1件のみ表示される。expanded=10 にすると常に全展開。
expanded=1,
)
pages.run()# pages/overview.py
# ---------------------
import streamlit as st
st.sidebar.markdown("---")
st.sidebar.caption("v1.0.0")
st.title("概要")
st.write("ここは概要ページです。")
# pages/detail.py
# ---------------------
import streamlit as st
st.sidebar.markdown("---")
st.sidebar.caption("v1.0.0")
st.title("詳細")
st.write("ここは詳細ページです。")
# pages/analytics.py
# ---------------------
import streamlit as st
st.sidebar.markdown("---")
st.sidebar.caption("v1.0.0")
st.title("分析")
st.write("ここは分析ページです。")
# pages/report.py
# ---------------------
import streamlit as st
st.sidebar.markdown("---")
st.sidebar.caption("v1.0.0")
st.title("レポート")
st.write("ここはレポートページです。")
# pages/config.py
# ---------------------
import streamlit as st
st.sidebar.markdown("---")
st.sidebar.caption("v1.0.0")
st.title("設定")
st.write("ここは設定ページです。")
# pages/help.py
# ---------------------
import streamlit as st
st.sidebar.markdown("---")
st.sidebar.caption("v1.0.0")
st.title("ヘルプ")
st.write("ここはヘルプページです。")
ドキュメントに重要な条件が書かれています:
This parameter is only used when position=”sidebar” and the sidebar has other elements below the navigation menu. If the sidebar only contains the navigation menu, it will always be fully expanded.
つまり、サイドバーにナビゲーション以外の要素がない場合は常に全展開になります。expanded を機能させるには、各ページのサイドバーに何か追加要素が必要です。
4-2. st.Page が外部URLをサポート
st.Page に外部URLを渡せるようになりました。ドキュメントサイトや外部ツールへのリンクをナビゲーションに自然に組み込めます。
import streamlit as st
pages = st.navigation([
st.Page("home.py", title="ホーム"),
st.Page("analysis.py", title="分析"),
# 外部URLを直接指定
st.Page("https://docs.streamlit.io", title="ドキュメント", icon=":material/open_in_new:"),
])
pages.run()5. チャット・インタラクションの改善
LLMを使ったチャットアプリ開発をサポートする改善が複数入りました。
5-1. st.chat_input の高さ指定
height パラメータで入力エリアの初期高さをピクセルで指定できます。長いプロンプトを入力することが多いアプリでは、高さを広げておくことでUXが向上します。
import streamlit as st
# チャット履歴の表示
for msg in st.session_state.get("messages", []):
with st.chat_message(msg["role"]):
st.write(msg["content"])
# 高さを指定した入力エリア
prompt = st.chat_input(
placeholder="メッセージを入力してください...",
height=120, # 新パラメータ:初期高さ(px)
accept_file="multiple",
)
5-2. ファイルタイプショートカット
st.file_uploader と st.chat_input のファイル添付で、MIMEタイプの詳細な記述なしにファイル種別を指定できるショートカットが使えるようになりました。
import streamlit as st
# 以前
uploaded = st.file_uploader(
"画像をアップロード",
type=["jpg", "jpeg", "png", "gif", "webp"],
)
# 1.56.0 以降:ショートカット指定が可能
uploaded = st.file_uploader(
"画像をアップロード",
type="image", # "image" / "audio" / "video" / "document"
)
5-3. ストリーミングMarkdownの自動補完
LLMからのレスポンスをストリーミング表示する際、生成途中で未完了のMarkdown構文(閉じていない ** や ` など)があっても、画面上で崩れずに表示されるようになりました。ストリーミング完了後に正しいMarkdownとしてレンダリングされます。
import streamlit as st
import time
def fake_llm_stream():
# 途中で太字が閉じていないレスポンスを模擬
tokens = ["これは ", "**重要な", "情報", "**です。", " 詳細は後述します。"]
for token in tokens:
yield token
time.sleep(0.3)
with st.chat_message("assistant"):
# write_stream が未完了Markdownを自動補完しながら表示
st.write_stream(fake_llm_stream())6. その他の注目アップデート
アラート要素のアイコン自動抽出
st.info、st.warning、st.error、st.success のメッセージ先頭にMaterialアイコンを書くと、自動でアイコンとして抽出・表示されます。
import streamlit as st
# アイコンが自動抽出されて表示される
st.success(":material/check_circle: 処理が完了しました")
st.warning(":material/warning: ファイルサイズが大きすぎます")
st.error(":material/error: 接続に失敗しました")
st.info(":material/info: 設定を確認してください")
st.container の autoscroll
autoscroll=True を指定すると、コンテナに新しいコンテンツが追加されるたびに自動で最下部にスクロールします。ログの表示やチャット履歴のUIに最適です。
import streamlit as st
import time
log_container = st.container(height=300, autoscroll=True) # 新パラメータ
for i in range(20):
log_container.write(f"[{i+1:02d}] 処理中... ステップ {i+1}")
time.sleep(0.1)st.tabs / st.expander / st.popover の状態保持
key パラメータを指定すると、reruns をまたいでタブの選択状態やエクスパンダーの開閉状態が保持されるようになりました。
import streamlit as st
# key を指定することで状態が保持される
tab1, tab2 = st.tabs(["データ", "設定"], key="main_tabs")
with st.expander("詳細オプション", key="detail_options"):
st.slider("閾値", 0.0, 1.0, 0.5)pandas 3.x 対応
pandas 3.x 系がサポートされました。st.dataframe や st.data_editor でpandasの最新機能(Copy-on-Write など)を活用したデータを安全に扱えます。
Pandas 3.x系についてはこちらの記事を参照して下さい。

7. まとめ
Streamlit 1.56.0 の主な変更点を整理します。
| カテゴリ | 変更内容 |
|---|---|
| 新ウィジェット | st.menu_button、st.iframe の追加 |
| セレクト改善 | filter_mode パラメータによる絞り込み検索 |
| dataframe 強化 | 選択の初期値指定、single-row-required、AudioColumn/VideoColumn、列の整列 |
| ナビゲーション | st.navigation の expanded、st.Page の外部URLサポート |
| チャット改善 | st.chat_input の height、ファイルタイプショートカット |
| UI改善 | アラートのアイコン自動抽出、autoscroll、タブ/エクスパンダーの状態保持 |
| 互換性 | pandas 3.x、Python 3.14 (PEP 649)、Python -O/-OO フラグ |
今回のアップデートで特に注目すべきは st.dataframe の進化です。プログラムによる選択制御やメディア列の追加により、単なるデータ表示ではなくインタラクティブなデータ操作UIを実現できるようになりました。また、st.iframe と st.menu_button の追加により、これまでカスタムコンポーネントが必要だったユースケースをネイティブのAPIで実装できるようになっています。
アップグレードは以下のコマンドで実行できます。
pip install --upgrade streamlit公式のリリースノートは GitHub Releases および Streamlit Docs で確認できます。
最後まで読んでいただきありがとうございます。

コメント