Streamlit入門
一番簡単なWebアプリ作成

HAGAKUREプログラミング塾

講座の概要(第1回)

第2回では、各自が作りたいアプリを相談しながら作ります!

環境確認

画面共有は見えていますか?
音声ははっきりと聞こえていますか?
チャットはSlackの方でお願いします。

Special Thanks

佐賀県産業スマート化センターさまのコミュニティ支援にて、
ZOOMの有料プランを提供いただき、利用させていただいております。
https://www.saga-smart.jp/

今日のゴール

Streamlitで簡単なWebアプリを作り、
CSVファイルでデータを保存・読み込みできるようになる

自分の手でWebアプリを作る楽しさを体験!

Streamlitとは?

👉 Pythonコードだけで、インタラクティブなアプリが作れる!

環境構築

必要なパッケージをインストール

# bash
pip install streamlit pandas

インストール後、動作確認:

# bash
streamlit hello

ブラウザが開いて、デモアプリが表示されればOK!

Step 1: Hello World

app01.py - 最初のStreamlitアプリ

import streamlit as st

st.title("📝 私の最初のStreamlitアプリ")
st.header("見出し")
st.write("こんにちは、Streamlit!")
st.text("普通のテキスト")

実行方法:

# bash
streamlit run app01.py

Step 2: ユーザー入力

app02.py - インタラクティブな要素

import streamlit as st

st.title("📝 ユーザー入力のテスト")

name = st.text_input("お名前を入力してください")
age = st.number_input("年齢を入力してください", min_value=0, max_value=120)

if st.button("送信"):
    st.write(f"こんにちは、{name}さん!")
    st.write(f"年齢は{age}歳ですね。")

Step 3: CSVの基本操作

app03.py - データの読み書き

import streamlit as st
import pandas as pd
import os

CSV_FILE = "data.csv"

# CSVファイルの読み込み(なければ空のDataFrame)
if os.path.exists(CSV_FILE):
    df = pd.read_csv(CSV_FILE)
else:
    df = pd.DataFrame(columns=["名前", "年齢"])

st.title("📊 CSVデータの表示")
st.dataframe(df)

Step 4: データの保存

app04.py - データをCSVに保存

import streamlit as st
import pandas as pd
import os

CSV_FILE = "data.csv"

# データ読み込み
if os.path.exists(CSV_FILE):
    df = pd.read_csv(CSV_FILE)
else:
    df = pd.DataFrame(columns=["名前", "年齢"])

st.title("📝 データ登録アプリ")

# 入力フォーム
name = st.text_input("名前")
age = st.number_input("年齢", min_value=0, max_value=120)

if st.button("登録"):
    new_data = pd.DataFrame([{"名前": name, "年齢": age}])
    df = pd.concat([df, new_data], ignore_index=True)
    df.to_csv(CSV_FILE, index=False)
    st.success("登録しました!")

st.dataframe(df)

Step 5: 実践的アプリ(前半)

app05.py - お買い物リストアプリ

import streamlit as st
import pandas as pd
import os

CSV_FILE = "shopping.csv"

# データ読み込み
if os.path.exists(CSV_FILE):
    df = pd.read_csv(CSV_FILE)
else:
    df = pd.DataFrame(columns=["商品名", "数量", "購入済み"])

st.title("🛒 お買い物リストアプリ")

# 商品追加フォーム
st.subheader("📝 商品を追加")
col1, col2 = st.columns([3, 1])
with col1:
    item = st.text_input("商品名")
with col2:
    quantity = st.number_input("数量", min_value=1, value=1)

if st.button("追加"):
    if item:
        new_item = pd.DataFrame([{
            "商品名": item, "数量": quantity, "購入済み": False
        }])
        df = pd.concat([df, new_item], ignore_index=True)
        df.to_csv(CSV_FILE, index=False)
        st.success(f"{item} を追加しました!")
        st.rerun()  # 画面を再読み込み

Step 5: 実践的アプリ(後半)

購入済みチェック機能

# 買い物リストの表示と購入済みチェック
st.subheader("📋 買い物リスト")
if len(df) > 0:
    for idx, row in df.iterrows():
        col1, col2, col3 = st.columns([3, 1, 1])
        with col1:
            st.write(f"**{row['商品名']}**")
        with col2:
            st.write(f"数量: {row['数量']}")
        with col3:
            checked = st.checkbox(
                "購入済み",
                value=bool(row['購入済み']),
                key=f"check_{idx}"
            )
            if checked != bool(row['購入済み']):
                df.loc[idx, '購入済み'] = checked
                df.to_csv(CSV_FILE, index=False)
                st.rerun()
    
    # 統計情報
    total = len(df)
    completed = len(df[df['購入済み'] == True])
    st.write(f"進捗: {completed}/{total} 完了")
else:
    st.info("まだ商品が登録されていません")

ちょっと応用編

この後は少しだけ発展的なテクニック

ex1: タブ切り替え

最小限の実装

import streamlit as st

st.title("🧩 タブ切り替えの例")

tab_input, tab_result = st.tabs(["入力", "結果"]) 

with tab_input:
    name = st.text_input("名前")
    if st.button("保存"):
        st.session_state["name"] = name

with tab_result:
    st.write("入力結果")
    st.write(st.session_state.get("name", "まだ入力されていません"))

タブごとに with tab: ブロックでUIを分けます。

ex2: URLにパラメータを渡す

?name=太郎 のように指定して状態を共有

import streamlit as st

st.title("クエリパラメータの例")

# 単独パラメータ: ?name=太郎
name = st.query_params.get("name", "")
st.write(f"私の名前は{name}です。")

# 複数パラメータ: ?city=Tokyo&tag=sushi
city = st.query_params.get("city", "")
tag = st.query_params.get("tag", "")
st.write(f"出身は{city}、好きなものは{tag}です。")

URLを共有すれば、開いた時点で同じ値が反映されます。

ex3: config.toml で装飾

アプリ全体の見た目を設定ファイルで管理

# .streamlit/config.toml
[theme]
primaryColor = "#FF6B6B"           # ボタンや選択項目の色(赤系)
backgroundColor = "#FFF9E6"        # 背景色(薄い黄色)
secondaryBackgroundColor = "#E3F2FD"  # サイドバー背景色(薄い青)
textColor = "#1A1A1A"              # テキスト色(濃い黒)
font = "sans serif"                # フォント

配色以外(タイトル・レイアウト等)はコードで設定します。

ex3.5: ページ設定をコードで指定

st.set_page_config でタイトルやレイアウトを設定

import streamlit as st

# 必ず最初の行で呼び出す(他のst.〇〇より前)
st.set_page_config(
    page_title="私のアプリ",
    page_icon="📝",
    layout="wide"  # 画面幅いっぱい(デフォルトは"centered")
)

# ここから通常のコード
# .streamlit/config.toml の配色が自動で反映される
st.title("📝 私のアプリ")
st.write("ブラウザタブのタイトルとアイコンが設定されています")
st.button("ボタンの色は config.toml の primaryColor")

config.toml(配色)と set_page_config(ページ設定)を両方使えば完璧!

お買い物アプリの機能

今日作ったアプリでできること

👉 これをベースに、いろいろなアプリが作れます!

アプリを公開しよう

Streamlit Community Cloudでデプロイ(無料)

手順:

デプロイ時の注意点

requirements.txt を作成

# requirements.txt
streamlit
pandas

リポジトリに含めるファイル:

注意:CSVファイルはデプロイ時に初期化されます。
本格的なアプリにはデータベース(SQLite等)を検討しましょう。

応用アイデア(第2回に向けて)

次回は、各自が作りたいアプリを一緒に作っていきます!

第2回の内容

各自のアプリ制作ワークショップ

👉 第2回までに作りたいアプリを考えておきましょう!

参考資料

お疲れさまでした!

ご参加ありがとうございました

ご質問・フィードバックはSlackまでお願いします。

次回は各自のアプリ作りを楽しみましょう!🎉