From 0e22df8b66ba13e1664d1b5309eb344fefa6afbd Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Mon, 25 Aug 2025 14:04:22 +0000 Subject: [PATCH] feat(tasks): Add task completion with strikethrough MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Implements the ability for users to mark tasks as complete. - Adds a checkbox-like prefix ('☐' and '☑') to each task. - Clicking a task toggles its completion status. - Completed tasks are visually marked with a strikethrough font. - The completion status is persisted when the application is closed and reopened. This fulfills the primary requirement of REQ-機能-002. The ability to hide completed tasks will be implemented separately. --- MyProject/bujo_app.py | 48 +++++++++++++++++++++++++++++++++++++------ 1 file changed, 42 insertions(+), 6 deletions(-) diff --git a/MyProject/bujo_app.py b/MyProject/bujo_app.py index bb82a63..baab249 100644 --- a/MyProject/bujo_app.py +++ b/MyProject/bujo_app.py @@ -1,5 +1,5 @@ import tkinter as tk -from tkinter import messagebox +from tkinter import messagebox, font import os # データファイル名 @@ -11,11 +11,15 @@ def __init__(self, master): self.master = master master.title("デジタルバレットジャーナル") + # フォントの定義 + self.default_font = font.Font(family="Helvetica", size=10) + self.strikethrough_font = font.Font(family="Helvetica", size=10, overstrike=True) + # タスク入力フレーム self.task_frame = tk.Frame(master) self.task_frame.pack(pady=10) - self.task_entry = tk.Entry(self.task_frame, width=50) + self.task_entry = tk.Entry(self.task_frame, width=50, font=self.default_font) self.task_entry.pack(side=tk.LEFT, padx=5) self.task_entry.bind("", self.check_task_length) # 文字数制限のイベントバインド @@ -26,8 +30,9 @@ def __init__(self, master): self.task_list_frame = tk.Frame(master) self.task_list_frame.pack(pady=10) - self.task_listbox = tk.Listbox(self.task_list_frame, width=60, height=15) + self.task_listbox = tk.Listbox(self.task_list_frame, width=60, height=15, font=self.default_font) self.task_listbox.pack(side=tk.LEFT, fill=tk.BOTH, expand=True) + self.task_listbox.bind("", self.toggle_task_status) self.scrollbar = tk.Scrollbar(self.task_list_frame, orient="vertical", command=self.task_listbox.yview) self.scrollbar.pack(side=tk.RIGHT, fill="y") @@ -49,7 +54,7 @@ def add_task(self): """タスクを追加する""" task = self.task_entry.get().strip() if task: - self.task_listbox.insert(tk.END, task) + self.task_listbox.insert(tk.END, f"☐ {task}") self.task_entry.delete(0, tk.END) self.save_tasks() # タスク追加時に保存 @@ -57,8 +62,11 @@ def load_tasks(self): """ファイルからタスクを読み込む""" if os.path.exists(DATA_FILE): with open(DATA_FILE, "r", encoding="utf-8") as f: - for line in f: - self.task_listbox.insert(tk.END, line.strip()) + for i, line in enumerate(f): + task_text = line.strip() + self.task_listbox.insert(tk.END, task_text) + if task_text.startswith("☑ "): + self.task_listbox.itemconfig(i, {'font': self.strikethrough_font}) def save_tasks(self): """タスクをファイルに保存する""" @@ -71,6 +79,34 @@ def on_closing(self): self.save_tasks() self.master.destroy() + def toggle_task_status(self, event): + """タスクの完了状態を切り替える""" + selected_index = self.task_listbox.nearest(event.y) + if selected_index == -1: + return + + task_text = self.task_listbox.get(selected_index) + + if task_text.startswith("☑ "): + # タスクを未完了にする + new_task_text = f"☐ {task_text[2:]}" + self.task_listbox.delete(selected_index) + self.task_listbox.insert(selected_index, new_task_text) + self.task_listbox.itemconfig(selected_index, {'font': self.default_font}) + else: + # タスクを完了にする + new_task_text = f"☑ {task_text[2:]}" + self.task_listbox.delete(selected_index) + self.task_listbox.insert(selected_index, new_task_text) + self.task_listbox.itemconfig(selected_index, {'font': self.strikethrough_font}) + + # 選択状態を更新 + self.task_listbox.selection_clear(0, tk.END) + self.task_listbox.selection_set(selected_index) + self.task_listbox.activate(selected_index) + + self.save_tasks() + # アプリケーションの実行 if __name__ == "__main__": root = tk.Tk()