代码示例 | Python开发Todolist

import json
from datetime import datetime
import tkinter as tk
from tkinter import ttk, messagebox, simpledialog

class TodoList:
    # 保持原有数据操作类不变
    def __init__(self, filename='todos.json'):
        self.filename = filename
        self.tasks = []
        self.next_id = 1
        self.load()

    def load(self):
        try:
            with open(self.filename, 'r') as f:
                data = json.load(f)
                self.tasks = data.get('tasks', [])
                self.next_id = max(task['id'] for task in self.tasks) + 1 if self.tasks else 1
        except (FileNotFoundError, json.JSONDecodeError):
            self.tasks = []
            self.next_id = 1

    def save(self):
        with open(self.filename, 'w') as f:
            json.dump({'tasks': self.tasks}, f, indent=2)

    def add_task(self, content):
        if not content.strip():
            return False
        task = {
            'id': self.next_id,
            'content': content,
            'created_at': datetime.now().isoformat(),
            'completed': False
        }
        self.tasks.append(task)
        self.next_id += 1
        self.save()
        return True

    def complete_task(self, task_id, completed=True):
        for task in self.tasks:
            if task['id'] == task_id:
                task['completed'] = completed
                self.save()
                return True
        return False

    def delete_task(self, task_id):
        self.tasks = [task for task in self.tasks if task['id'] != task_id]
        self.save()
        return True

class TodoApp(tk.Tk):
    def __init__(self):
        super().__init__()
        self.title("Todo List 应用程序")
        self.geometry("800x600")
        
        self.todo = TodoList()
        self.create_widgets()
        self.refresh_list()

    def create_widgets(self):
        # 顶部输入区域
        input_frame = ttk.Frame(self, padding=10)
        input_frame.pack(fill=tk.X)
        
        self.task_entry = ttk.Entry(input_frame, width=50)
        self.task_entry.pack(side=tk.LEFT, expand=True, padx=5)
        
        add_btn = ttk.Button(input_frame, text="添加任务", command=self.add_task)
        add_btn.pack(side=tk.LEFT, padx=5)

        # 任务列表区域
        list_frame = ttk.Frame(self)
        list_frame.pack(fill=tk.BOTH, expand=True, padx=10, pady=10)
        
        self.tree = ttk.Treeview(list_frame, columns=('status', 'content', 'time'), show='headings')
        self.tree.heading('status', text='状态', anchor=tk.W)
        self.tree.heading('content', text='任务内容', anchor=tk.W)
        self.tree.heading('time', text='创建时间', anchor=tk.W)
        
        self.tree.column('status', width=80, anchor=tk.W)
        self.tree.column('content', width=400, anchor=tk.W)
        self.tree.column('time', width=200, anchor=tk.W)
        
        vsb = ttk.Scrollbar(list_frame, orient="vertical", command=self.tree.yview)
        self.tree.configure(yscrollcommand=vsb.set)
        
        self.tree.pack(side=tk.LEFT, fill=tk.BOTH, expand=True)
        vsb.pack(side=tk.RIGHT, fill=tk.Y)

        # 操作按钮区域
        btn_frame = ttk.Frame(self, padding=10)
        btn_frame.pack(fill=tk.X)
        
        ttk.Button(btn_frame, text="标记完成", command=self.mark_complete).pack(side=tk.LEFT, padx=5)
        ttk.Button(btn_frame, text="删除任务", command=self.delete_task).pack(side=tk.LEFT, padx=5)
        ttk.Button(btn_frame, text="显示全部", command=lambda: self.refresh_list()).pack(side=tk.LEFT, padx=5)
        ttk.Button(btn_frame, text="仅未完成", command=lambda: self.refresh_list(False)).pack(side=tk.LEFT, padx=5)
        ttk.Button(btn_frame, text="仅已完成", command=lambda: self.refresh_list(True)).pack(side=tk.LEFT, padx=5)

    def add_task(self):
        content = self.task_entry.get()
        if self.todo.add_task(content):
            self.task_entry.delete(0, tk.END)
            self.refresh_list()
        else:
            messagebox.showwarning("输入错误", "任务内容不能为空!")

    def mark_complete(self):
        selected = self.tree.selection()
        if not selected:
            messagebox.showwarning("操作错误", "请先选择任务!")
            return
        
        task_id = int(self.tree.item(selected[0])['values'][0])
        if self.todo.complete_task(task_id):
            self.refresh_list()
        else:
            messagebox.showerror("操作失败", "找不到指定任务!")

    def delete_task(self):
        selected = self.tree.selection()
        if not selected:
            messagebox.showwarning("操作错误", "请先选择任务!")
            return
        
        if messagebox.askyesno("确认删除", "确定要删除选中的任务吗?"):
            task_id = int(self.tree.item(selected[0])['values'][0])
            if self.todo.delete_task(task_id):
                self.refresh_list()
            else:
                messagebox.showerror("操作失败", "删除任务失败!")

    def refresh_list(self, show_completed=None):
        # 清空当前列表
        for item in self.tree.get_children():
            self.tree.delete(item)
        
        # 根据筛选条件显示任务
        tasks = self.todo.tasks
        if show_completed is not None:
            tasks = [t for t in tasks if t['completed'] == show_completed]
        
        for task in sorted(tasks, key=lambda x: x['id'], reverse=True):
            status = "已完成" if task['completed'] else "未完成"
            create_time = datetime.fromisoformat(task['created_at']).strftime("%Y-%m-%d %H:%M")
            self.tree.insert('', tk.END, values=(task['id'], status, task['content'], create_time))

if __name__ == "__main__":
    app = TodoApp()
    app.mainloop()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值