【Python / Streamlit】 「まいにち記録カレンダーアプリ」を作った
学んだこと(5/22)
-
「
import ライブラリ名 as あだ名」 → 長い道具箱の名前を短いあだ名(stやpd)にして、あとで呼び出しやすくする書き方 -
「
if st.button("文字"):」 → 画面のボタンが押された瞬間だけ、その下に続くコードを実行する文法 -
「
st.date_input("タイトル", 初期値)」 → クリックするとポンッと飛び出すカレンダーを1行で設置するメソッド -
「
st.radio("タイトル", [選択肢リスト], horizontal=True)」 → 複数から1つを選ばせるラジオボタン。horizontal=Trueをつけると横一列にスッキリ並ぶ -
「
st.text_input("タイトル", placeholder="例")」 → キーボードから自由な1行の文字を入力してもらう欄。placeholderは未入力時にうっすら表示される入力例 -
「
リスト名[0]」 → データや文字の塊の「最初(1番目)」をピンポイントで取り出す書き方。 -
「
pd.DataFrame({ "列名": [データ] })」 → バラバラのデータを、ExcelやCSVにそのまま保存できる「きれいな表(行列)」に一瞬で成形する書き方 -
「
st.title()」 → 画面の最上部に一番大きな文字でタイトルを表示 -
「
st.write()」 → 通常の大きさの文字や説明文、データの表などを自動で一番見やすい形にして画面に表示する -
「
st.subheader("文字")」 → タイトルより少し小さめの「中見出し」を画面に表示するメソッド -
「
os.path.exists(ファイル名)」 → パソコンの中に指定したファイルがすでに実在するかどうかをチェックする文法 -
「
if 条件: ~ else:」 → もし条件が「はい」ならifの下を、条件が「いいえ」ならelse:の下を実行する条件分岐の文法 -
「
データ.to_csv(ファイル名, mode='a', header=False, index=False)」 → データをCSVファイルに書き出す処理。mode='a'は追記、index=Falseは余計な行番号を付けない指定 -
「
pd.read_csv(ファイル名)」 → パソコンに保存されているCSVファイルを読み込んで、プログラムの中で扱える表データに戻す機能 -
「
st.dataframe(df, use_container_width=True)」 → 読み込んだ表データを画面に表示する。use_container_width=Trueで画面幅に自動フィットさせる指定 -
「
st.success("メッセージ")」 → 処理が成功したときに、画面に緑色のきれいな成功枠(ポップアップ)を出すメソッド -
「
st.info("メッセージ")」 → ユーザーに使い方などを案内する、青色の優しいお知らせ枠を画面に出すメソッド
アプリの全体コード
今回作成した app.py の全コードです。Streamlitを使うと、わずか40行弱で画面構築からデータ保存、過去ログの表示まで完結します。
import streamlit as st
import pandas as pd
import os
from datetime import datetime
# アプリのタイトル
st.title("🍀 まいにち記録カレンダー")
st.write("今日の日付を選んで、記号と一言メモを記録しよう。")
# 1. 入力フォームの作成
selected_date = st.date_input("日付を選択してください:", datetime.now())
status = st.radio("今日の運勢・気分は?", ["◎ 幸運だった!", "〇 普通だった", "▲ 不幸・不調だった"], horizontal=True)
bad_memo = st.text_input("😢 不幸だったこと(一行メモ):", placeholder="例:お気に入りの傘を忘れた")
good_memo = st.text_input("✨ 幸運だったこと(一行メモ):", placeholder="例:欲しかったお菓子が買えた")
# 2. 保存ボタンが押されたときの処理
if st.button("今日の記録を保存する"):
# 保存するデータを表の形にする
new_row = pd.DataFrame({
"日付": [str(selected_date)],
"状態": [status[0]], # 「◎」「〇」「▲」の1文字目だけを取得
"不幸だったこと": [bad_memo],
"幸運だったこと": [good_memo]
})
csv_file = "diary.csv"
# すでにファイルがあれば追記、なければ新規作成
if os.path.exists(csv_file):
new_row.to_csv(csv_file, mode='a', header=False, index=False)
else:
new_row.to_csv(csv_file, mode='w', header=True, index=False)
st.success(f"【{selected_date}】の記録を保存しました!")
# 3. 過去の記録を表示する
csv_file = "diary.csv"
if os.path.exists(csv_file):
st.subheader("📖 過去の記録一覧")
df = pd.read_csv(csv_file)
st.dataframe(df, use_container_width=True)
else:
st.info("まだ記録がありません。上のフォームから最初の記録を保存してみましょう!")