2026年10月14日、PythonだけでWebアプリを作れるライブラリ、Streamlitの1.66.0が公開されました。データの可視化や、ちょっとした社内ツールづくりで人気のライブラリです。
今回の更新では、10月9日に正式版が出たPython 3.15に対応しました。一方で、サポートが終わったPython 3.10では使えなくなっています。
ほかにも、入力部品の動きを細かく調整できる設定や、ブラウザを開かずにアプリを試せるテストの機能が強化されました。今回は、実際に動かしながら順番に見ていきます。
まずは何が変わったのかを整理しよう¶
最初に、今回取り上げる変更を表にまとめます。内容は、Streamlitの公式ドキュメントのリリースノートにもとづいています。
| 変更 | 中身 |
|---|---|
| Python 3.15に対応 | 新しいPythonの上で動くようになった |
| Python 3.10のサポート終了 | 3.11以上が必要に |
| on_change="ignore" | すべての状態を持つ入力部品で使えるようになった |
| ページの余白の設定 | theme.paddingTopとpaddingBottomで上下の余白を調整できる |
| AppTestの強化 | フォームの送信ボタンなどもテストで扱えるようになった |
| アクセシビリティの改善 | キーボードやスクリーンリーダーで使いやすくなった |
PyPIの記録によると、1.66.0が必要とするPythonは3.11以上です。3.10のままpip installすると、1.66ではなく、それより前の版が入ります。
Streamlitそのものがまだよくわからない方は、先にこちらを読んでおくと話がつながります。【関連記事】PythonのStreamlitとは?
Python 3.15に対応し、3.10は対象外に¶
リリースノートによると、Streamlitは1.66でPython 3.15に対応しました。正式版の公開から5日で、主要なライブラリがまた1つ対応したことになります。
同時に、サポート期間が終わったことを理由に、Python 3.10のサポートを終了しています。NumPy、pandas、Pillow、PyArrowについても、Python 3.11向けのビルド済みファイルがある版以上が必要になりました。
Python 3.15がどんなバージョンかは、こちらで実際に動かしながら紹介しています。【関連記事】Python 3.15が正式リリース
3.10のサポートが10月1日に終わったことは、こちらで取り上げました。主要なライブラリが3.10を外していく流れは、今後も続いていきそうです。【関連記事】Python 3.15の正式版は10月9日に延期、3.10はサポート終了へ
すべての入力部品でon_change="ignore"が使える¶
Streamlitのアプリは、利用者が入力部品を操作するたびに、スクリプトを上から実行し直すのが基本の動きです。これを再実行、英語でrerunと呼びます。
リリースノートによると、on_change="ignore"を指定すると、値が変わっても再実行は起きません。部品の表示と、つながっているURLのクエリパラメーターだけが更新され、Pythonは次の再実行のときに新しい値を受け取ります。
1.66では、この設定が残りの入力部品にも広がり、すべての状態を持つ部品で使えるようになりました。今回追加された主な部品は次のとおりです。
| 種類 | 部品 |
|---|---|
| 選択 | st.pills、st.segmented_control |
| 入力 | st.color_picker、st.datetime_input、st.feedback |
| 録音・撮影 | st.camera_input、st.audio_input |
| データ | st.data_editor、st.pagination |
たとえば、いくつかの条件をまとめて選んでから、最後にボタンで一度だけ計算したい場面を考えてみてください。部品を触るたびに重い処理が走るのを、再実行させないことで防げるわけです。
ブラウザなしでアプリを試せるAppTest¶
学習者や実務の人にとって嬉しいのが、AppTestの強化です。AppTestは、ブラウザを開かずに、Pythonのコードの中からStreamlitのアプリを動かして試せる仕組みです。
リリースノートによると、1.66では、フォームをキーで探して、その送信ボタンを押せるようになりました。ほかにも、リンクのボタンや進捗バー、ページ送りなど、扱える部品が増えています。
フォームのアプリを用意する¶
実際に試してみましょう。まずは、身長と体重を入れてBMIを計算する、小さなアプリをapp.pyとして用意します。
import streamlit as st
st.title("BMI計算")
with st.form(key="bmi_form"):
height = st.number_input("身長(cm)", value=170.0)
weight = st.number_input("体重(kg)", value=60.0)
submitted = st.form_submit_button("計算する")
if submitted:
bmi = weight / (height / 100) ** 2
st.write(f"BMIは {bmi:.1f} です")
st.formを使うと、中の入力部品をまとめて、送信ボタンを押したときだけ再実行させられます。キーにbmi_formという名前を付けているのがポイントです。
AppTestでボタンを押してみる¶
続いて、このアプリをAppTestで動かすコードを書きます。入力欄に値を入れ、フォームの送信ボタンを押し、表示された結果を取り出します。
from streamlit.testing.v1 import AppTest
at = AppTest.from_file("app.py").run()
at.number_input[0].set_value(160.0)
at.number_input[1].set_value(64.0)
at.form(key="bmi_form").form_submit_button[0].click().run()
print(at.markdown[0].value)
Streamlit 1.66.0を新しい仮想環境に入れ、手元のPython 3.11で実行した結果です。動作に関係のない警告の行は省いています。
BMIは 25.0 です
身長160cm、体重64kgのBMIは、64を1.6の2乗で割って25.0です。ブラウザを一度も開かずに、ボタンを押したあとの表示までを確かめられました。
pytestと組み合わせると便利¶
この仕組みは、pytestのようなテストの道具と組み合わせると力を発揮します。printの代わりにassertで結果を確かめれば、アプリを直すたびに自動でチェックできます。
実際に、先ほどのコードをpytestのテストとして書き直してみました。test_bmi.pyとして保存します。
from streamlit.testing.v1 import AppTest
def test_bmi():
at = AppTest.from_file("app.py").run()
at.number_input[0].set_value(160.0)
at.number_input[1].set_value(64.0)
at.form(key="bmi_form").form_submit_button[0].click().run()
assert at.markdown[0].value == "BMIは 25.0 です"
同じフォルダでpython -m pytest -q test_bmi.pyを実行すると、1 passed in 0.72sと表示されました。1秒もかからずに、フォームの入力から結果の表示までを確かめられています。
計算式をうっかり書き換えてしまっても、このテストを流せばすぐに間違いに気づけるようになります。
pytestの基本は、こちらで紹介しています。【関連記事】Pythonのpytestとは?
私は10年ほどエンジニアとして開発に関わってきましたが、画面のあるアプリほど、確認が手作業になって後回しにされがちでした。画面の操作をコードで再現できると、小さな修正のたびに安心して確かめられるようになります。
アクセシビリティと見た目の改善¶
1.66では、キーボードやスクリーンリーダーで使う人への配慮も進みました。リリースノートによると、本文へ飛ぶリンクが加わり、ページの構造を表す目印も付くようになっています。
スクリーンリーダーとは、画面の内容を音声で読み上げる道具のことです。日付の入力欄のカレンダーボタンにキーボードで移動できるようになるなど、細かな改善が多数入りました。
見た目の面では、ページの上下の余白を設定ファイルで調整できるtheme.paddingTopとtheme.paddingBottomが加わりました。サイドバーだけ別の値にすることもできます。
リリースノートには、この機能に対応する以前からの要望(GitHubのissue #6336)も紐づけられています。設定ファイルの数行で済むようになったのは、見た目にこだわりたい方には嬉しい変更です。
独自のCSSを書いている方は注意¶
ただし、この変更にともない、独自のCSSを書いている方には注意点があります。リリースノートでは、section[data-testid="stMain"]のようなセレクターは、タグの部分を外すよう案内されています。
サイドバーの開閉の状態を読み取るCSSやスクリプトも、aria-expandedではなくdata-collapsedを使うよう変わりました。見た目を細かく作り込んでいる方は、上げる前に一度確認しておきましょう。
そのほかの変更¶
リリースノートには、ほかにも利用者に関係する変更が並んでいます。代表的なものを紹介します。
httptoolsが必須ではなくなり、速いHTTPの読み取りを使い続けたい場合はstreamlit[performance]で入れる形になりました。また、tomlというライブラリも不要になっています。
secrets.tomlの書き方が間違っていて読み込めないときは、起動時にエラーが記録されるようになりました。これまでは、何も言わずに空の設定のまま動いていたそうです。
以前、設定ファイルの書き間違いに気づかず、APIキーが空のまま動いていたせいで原因探しに時間がかかったことがあります。間違いをすぐに知らせてくれる変更は、地味ですが本当に助かります。
安全面での修正も入った¶
リリースノートのバグ修正の中には、安全に関わるものも含まれています。代表的な2つを紹介します。
1つ目は、ページを切り替えるst.switch_pageとst.page_linkの修正です。Windowsのネットワーク上のパスなどを受け付けないようになり、信頼できない入力によってSMBという共有フォルダの通信が起きるのを防ぎます。
2つ目は、無効にしたダウンロードボタンの修正です。dataに関数を渡していると、ボタンが無効なのに、その関数を動かすダウンロードが登録されてしまう問題が直されました。
どちらも、自分で気づくのは難しい問題です。だからこそ、ライブラリは新しい版に保っておくのが安心です。
まとめ¶
Streamlit 1.66.0が2026年10月14日に公開されました。Python 3.15に対応して3.10のサポートを終え、on_change="ignore"がすべての入力部品に広がり、AppTestでフォームのテストもできるようになりました。
なかでもAppTestは、ブラウザを開かずにアプリを試せる、学習者にもおすすめの機能です。自分のアプリで、まずは1つテストを書いてみてください。
ここまでお読みいただきありがとうございました。