import os
import json
from datetime import datetime
class Task:
def __init__(self, description, deadline=None, completed=False):
self.description = description
self.deadline = deadline
self.completed = completed
def to_dict(self):
return {
"description": self.description,
"deadline": self.deadline.strftime("%Y-%m-%d %H:%M") if self.deadline else None,
"completed": self.completed
}
@classmethod
def from_dict(cls, task_dict):
deadline_str = task_dict.get("deadline")
deadline = datetime.strptime(deadline_str, "%Y-%m-%d %H:%M") if deadline_str else None
return cls(task_dict["description"], deadline, task_dict["completed"])
class TaskList:
def __init__(self, filename):
self.filename = filename
self.tasks = []
self.load_tasks()
def load_tasks(self):
if os.path.exists(self.filename):
with open(self.filename, 'r') as file:
task_data = json.load(file)
self.tasks = [Task.from_dict(task_dict) for task_dict in task_data]
def save_tasks(self):
with open(self.filename, 'w') as file:
task_data = [task.to_dict() for task in self.tasks]
json.dump(task_data, file, indent=4)
def add_task(self, description, deadline_str=None):
deadline = datetime.strptime(deadline_str, "%Y-%m-%d %H:%M") if deadline_str else None
task = Task(description, deadline)
self.tasks.append(task)
self.save_tasks()
print("タスクを追加しました")
def edit_task(self, task_index, description=None, deadline_str=None):
if 1 <= task_index <= len(self.tasks):
task = self.tasks[task_index - 1]
if description:
task.description = description
if deadline_str:
task.deadline = datetime.strptime(deadline_str, "%Y-%m-%d %H:%M") if deadline_str else None
self.save_tasks()
print("タスクを編集しました")
else:
print("無効なタスク番号です")
def display_tasks(self):
if not self.tasks:
print("タスクはありません")
else:
print("タスク一覧:")
for i, task in enumerate(self.tasks, 1):
status = "完了" if task.completed else "未完了"
deadline = task.deadline.strftime("%Y-%m-%d %H:%M") if task.deadline else "なし"
print(f"{i}. [{status}] {task.description} (締切: {deadline})")
def mark_task_completed(self, task_index):
if 1 <= task_index <= len(self.tasks):
task = self.tasks[task_index - 1]
task.completed = True
self.save_tasks()
print(f"タスク '{task.description}' を完了にしました")
else:
print("無効なタスク番号です")
def delete_task(self, task_index):
if 1 <= task_index <= len(self.tasks):
deleted_task = self.tasks.pop(task_index - 1)
self.save_tasks()
print(f"タスク '{deleted_task.description}' を削除しました")
else:
print("無効なタスク番号です")
def main():
filename = "tasks.json"
task_list = TaskList(filename)
while True:
print("\n操作を選択してください:")
print("1. タスクを追加")
print("2. タスクを編集")
print("3. タスク一覧を表示")
print("4. タスクを完了にする")
print("5. タスクを削除する")
print("6. 終了")
choice = input("選択 (1/2/3/4/5/6): ")
if choice == '6':
break
elif choice == '1':
description = input("新しいタスクの説明を入力してください: ")
deadline_str = input("締切日時 (YYYY-MM-DD HH:MM) を入力してください (未入力可): ")
task_list.add_task(description, deadline_str)
elif choice == '2':
task_list.display_tasks()
task_index = int(input("編集するタスクの番号を入力してください: "))
description = input("新しい説明を入力してください (未入力で変更なし): ")
deadline_str = input("新しい締切日時 (YYYY-MM-DD HH:MM) を入力してください (未入力で変更なし): ")
task_list.edit_task(task_index, description, deadline_str)
elif choice == '3':
task_list.display_tasks()
elif choice == '4':
task_list.display_tasks()
task_index = int(input("完了にするタスクの番号を入力してください: "))
task_list.mark_task_completed(task_index)
elif choice == '5':
task_list.display_tasks()
task_index = int(input("削除するタスクの番号を入力してください: "))
task_list.delete_task(task_index)
else:
print("無効な選択です")
if __name__ == "__main__":
main()