今回はタスク管理アプリをStreamlitを使って作成していきたいと思います。
今回作成するアプリのイメージ
アプリのイメージはこのようになります。
タスクの追加や編集ができます。
ポイントは、うまくセッション機能を使って変数の値を保持するようにすることです。
コード全体
import streamlit as st
from datetime import datetime
# タスクリストと完了済みタスクリストをセッション状態で管理
if 'tasks' not in st.session_state:
st.session_state.tasks = []
# タイトルを表示
st.title("タスク管理アプリ")
# タスクを追加するフォームを作成
task = st.text_input("タスクを入力してください:")
deadline = st.date_input("期限を設定してください:")
if st.button("追加"):
if task:
st.session_state.tasks.append({"task": task, "deadline": deadline, "completed": False})
# タスクの表示と操作
if st.session_state.tasks:
st.write("タスクリスト:")
for i, task_info in enumerate(st.session_state.tasks, start=1):
task_text = task_info["task"]
task_deadline = task_info["deadline"]
completed = task_info["completed"]
if not completed:
st.write(f"{i}. **{task_text}** (期限: {task_deadline})")
# タスクの完了マーク
if st.checkbox(f"完了済みにする ({i})"):
st.session_state.tasks[i - 1]["completed"] =True
st.experimental_rerun()
# タスクの編集
new_task_text = st.text_input(f"編集 ({i}):", task_text)
st.session_state.tasks[i - 1]["task"] = new_task_text
# 編集を反映するボタン
if st.button(f"編集を反映 ({i})"):
st.session_state.tasks[i - 1]["task"] = new_task_text
# タスクの削除
if st.button(f"削除 ({i})"):
st.session_state.tasks.pop(i - 1)
st.experimental_rerun() # ページの再レンダリングをトリガーする
# タスクの期限が近づいている場合に通知する
today = datetime.today().date()
for task_info in st.session_state.tasks:
task_deadline = task_info["deadline"]
if task_deadline and task_deadline < today:
st.warning(f"期限切れのタスク: **{task_info['task']}** (期限: {task_deadline})")
# 完了済みのタスクを表示
st.write("完了済みタスク:")
for i, task_info in enumerate(st.session_state.tasks, start=1):
task_text = task_info["task"]
task_deadline = task_info["deadline"]
completed = task_info["completed"]
if completed:
st.write(f"{i}. {task_text}")
コードの解説
1. ライブラリのインポートとセッションの管理
import streamlit as st
from datetime import datetime
# タスクリストと完了済みタスクリストをセッション状態で管理
if 'tasks' not in st.session_state:
st.session_state.tasks = []
この部分では、必要なライブラリをインポートし、Streamlitとdatetimeモジュールを使用しています。また、タスクリストをセッション状態で管理するための初期化を行っています。
2. アプリケーションのタイトルを表示
st.title("タスク管理アプリ")
この行は、アプリケーションのタイトルを表示しています。
3. タスクを追加するフォームを作成
task = st.text_input("タスクを入力してください:")
deadline = st.date_input("期限を設定してください:")
if st.button("追加"):
if task:
st.session_state.tasks.append({"task": task, "deadline": deadline, "completed": False})
このセクションでは、タスクを追加するためのフォームを作成しています。ユーザーはタスクと期限を入力し、「追加」ボタンをクリックして新しいタスクをリストに追加できます。
4. タスクの表示と操作
if st.session_state.tasks:
st.write("タスクリスト:")
for i, task_info in enumerate(st.session_state.tasks, start=1):
task_text = task_info["task"]
task_deadline = task_info["deadline"]
completed = task_info["completed"]
if not completed:
st.write(f"{i}. **{task_text}** (期限: {task_deadline})")
# タスクの完了マーク
if st.checkbox(f"完了済みにする ({i})"):
st.session_state.tasks[i - 1]["completed"] =True
st.experimental_rerun()
# タスクの編集
new_task_text = st.text_input(f"編集 ({i}):", task_text)
st.session_state.tasks[i - 1]["task"] = new_task_text
# 編集を反映するボタン
if st.button(f"編集を反映 ({i})"):
st.session_state.tasks[i - 1]["task"] = new_task_text
# タスクの削除
if st.button(f"削除 ({i})"):
st.session_state.tasks.pop(i - 1)
st.experimental_rerun()
この部分では、タスクのリストを表示し、それぞれのタスクに対して完了マーク、編集、削除の操作が可能です。タスクが完了していない場合には、完了マークをつけたり、タスクの編集や削除を行えます。
5. 期限切れのタスクの通知
today = datetime.today().date()
for task_info in st.session_state.tasks:
task_deadline = task_info["deadline"]
if task_deadline and task_deadline < today:
st.warning(f"期限切れのタスク: **{task_info['task']}** (期限: {task_deadline})")
このセクションでは、期限切れのタスクがある場合に警告メッセージを表示します。現在の日付とタスクの期限を比較して、期限切れのタスクを特定します。
6. 完了済みのタスクを表示
st.write("完了済みタスク:")
for i, task_info in enumerate(st.session_state.tasks, start=1):
task_text = task_info["task"]
task_deadline = task_info["deadline"]
completed = task_info["completed"]
if completed:
st.write(f"{i}. {task_text}")
最後に、完了済みのタスクを表示します。