こんにちは、JS2IIUです。
StreamlitでWebアプリを開発する際、時間のかかる処理を行う場合は、ユーザーに現在の進捗状況を分かりやすく示すことが重要です。Streamlitでは、st.progress()関数を使うことで簡単にプログレスバーを表示できます。今回もよろしくお願いします。
st.progress()関数のシグネチャとパラメータ
st.progress()関数は、以下のシグネチャとパラメータを持ちます。
st.progress(value, text=None)value: プログレスバーの値 (0から100までの整数、もしくは0.0から1.0の小数)text: プログレスバーの上に表示するテキスト (オプション)
valueパラメータには、プログレスバーの現在の進捗状況を表す0から100までの整数を指定します。textパラメータはオプションで、プログレスバーの上に表示するメッセージ。テキストには、オプションで GitHub フレーバーの Markdown を含めることができます: 太字、斜体、取り消し線、インラインコード、リンク、画像。画像はアイコンのように表示され、最大高さはフォントの高さと同じです。
詳しくは、以下の公式ドキュメントを参照してください。
この記事では、st.progress()関数の具体的な使用例を3つ、サンプルプログラムとともに紹介します。
例1:単純なプログレスバー
まずは、0から100まで0.1秒ごとに進捗するシンプルなプログレスバーの例です。
import streamlit as st
import time
progress_bar = st.progress(0, text='progress bar sample')
for i in range(100):
time.sleep(0.1)
if i < 80:
msg = 'progress bar running'
elif i < 98:
msg = 'almost done'
else:
msg = 'done'
progress_bar.progress(i + 1, text=msg)このコードでは、まずst.progress(0)で初期値0のプログレスバーを作成します。forループ内でtime.sleep(0.1)で0.1秒待機し、progress_bar.progress(i + 1)でプログレスバーの値を更新しています。
例2:ファイルアップロードの進捗表示
次に、ファイルアップロードの進捗状況を表示する例です。
import streamlit as st
import time
uploaded_file = st.file_uploader("Choose a file")
if uploaded_file is not None:
progress_bar = st.progress(0)
file_size = uploaded_file.size
bytes_read = 0
with open("temp.txt", "wb") as f:
while True:
chunk = uploaded_file.read(1024)
if not chunk:
break
f.write(chunk)
bytes_read += len(chunk)
progress_bar.progress(int(bytes_read / file_size * 100))
time.sleep(0.1)このコードでは、st.file_uploader()でファイルアップロードを受け付け、アップロードされたファイルのサイズを取得します。whileループ内でファイルを読み込み、progress_bar.progress()で進捗状況を更新しています。
例3:外部API呼び出しの進捗表示
最後に、外部APIを呼び出す際の進捗状況を表示する例です。ここでは、OpenWeatherMapのAPIを使用して、東京の天気予報を取得する例を示します。
import streamlit as st
import requests
import json
url = "https://api.openweathermap.org/data/2.5/weather?q=Tokyo,jp&appid=YOUR_API_KEY" # YOUR_API_KEYを自分のAPIキーに置き換えてください
progress_bar = st.progress(0)
with st.spinner("Waiting for API response..."):
response = requests.get(url, stream=True)
total_size = int(response.headers.get('content-length', 0))
bytes_read = 0
content = b"" # レスポンスの内容を格納する変数
for chunk in response.iter_content(chunk_size=1024):
if chunk:
content += chunk
bytes_read += len(chunk)
progress = int(bytes_read / total_size * 100)
progress_bar.progress(progress)
# 進捗が100になったらレスポンスを表示
if progress == 100:
weather_data = json.loads(content.decode('utf-8')) # レスポンスをJSONとして読み込み
# st.json() を使用して整形表示
st.json(weather_data)このコードでは、requests.get()でOpenWeatherMapのAPIを呼び出し、レスポンスのサイズを取得します。forループ内でレスポンスを処理し、progress_bar.progress()で進捗状況を更新しています。json.loads(content.decode('utf-8')) で、レスポンスをJSON形式として読み込み、Pythonの辞書に変換しています。st.json(weather_data) で、辞書データを整形して表示しています。st.json() を使うことで、JSONデータを折りたたみ可能な形式で見やすく表示できます。
注意: 上記のコードを実行するには、OpenWeatherMapのアカウントを作成し、APIキーを取得する必要があります。取得したAPIキーは、コード中のYOUR_API_KEYを置き換えて使用してください。
参考リンク
- st.progress – Streamlit Docs
- 【Streamlit】st.column_config.ProgressColumnの基本と使い方 | アマチュア無線局JS2IIU
- #30DaysOfStreamlit Day21 st.progress
- OpenWeatherMap API
まとめ
この記事では、Streamlitのst.progress()関数を使ってプログレスバーを表示する方法を紹介しました。プログレスバーは、時間のかかる処理を行う際にユーザーに現在の進捗状況を分かりやすく示すために役立ちます。ぜひ、st.progress()関数を使って、ユーザーフレンドリーなWebアプリを開発してください。
Pythonに関する書籍のPRです。
24年9月に出版された「ハイパーモダンPython-信頼性の高いワークフローを構築するモダンテクニック」、Claudio Jolowicz著、嶋田、鈴木訳。開発環境の構築、プロジェクトの管理、テストに関して実践的な内容でとても参考になる一冊です。
最後まで読んでいただきありがとうございました。73

