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()
代码示例 | Python开发Todolist
于 2025-03-31 14:45:38 首次发布

744

被折叠的 条评论
为什么被折叠?



