|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
- # 导入必要的库
- import tkinter as tk
- import pandas as pd
- import os
- from tkinter import messagebox, ttk
- from todo_gui import create_gui
- # 定义待办事项应用类
- class TodoApp:
- def __init__(self):
- # 初始化任务列表
- self.tasks = []
- # 加载任务
- self.load_tasks()
- # 添加任务的方法
- def add_task(self, task, completion_time=None, remark=None):
- # 将新任务添加到任务列表中
- self.tasks.append({'task': task, 'completed': False, 'completion_time': completion_time, 'remark': remark})
- # 删除任务的方法
- def delete_task(self, index):
- # 从任务列表中移除指定索引的任务
- self.tasks.remove(self.tasks[index])
- # 查看任务的方法
- def view_tasks(self):
- # 检查任务列表是否为空
- if not self.tasks:
- print('没有任务。')
- else:
- # 遍历任务列表并打印任务信息
- for i, task in enumerate(self.tasks):
- status = '已完成' if task['completed'] else '未完成'
- print(f'{i + 1}. {task["task"]} - {status}')
- # 将任务保存到 Excel 文件的方法
- def save_to_excel(self):
- # 将任务列表转换为 DataFrame
- df = pd.DataFrame(self.tasks)
- # 将 DataFrame 保存到 Excel 文件
- df.to_excel('tasks.xlsx', index=False)
- # 加载任务的方法
- def load_tasks(self):
- # 检查 Excel 文件是否存在
- if os.path.exists('tasks.xlsx'):
- try:
- # 读取 Excel 文件
- df = pd.read_excel('tasks.xlsx')
- # 将 DataFrame 转换为字典列表
- self.tasks = df.to_dict(orient='records')
- except Exception as e:
- # 显示错误消息框
- messagebox.showerror('错误', f'加载任务时出错: {e}')
- # 标记任务为已完成的方法
- def mark_task_completed(self, index):
- # 将指定索引的任务标记为已完成
- self.tasks[index]['completed'] = True
- if __name__ == '__main__':
- # 创建 TodoApp 实例
- todo = TodoApp()
- # 创建 GUI
- create_gui(todo)
复制代码
- import tkinter as tk
- from tkinter import messagebox, ttk
- import os
- import pandas as pd
- from tkinter import OptionMenu
- from tkinter import StringVar
- import datetime
- # 定义全局变量
- tree = None
- # 定义年份、月份和日期的选项
- years = [str(year) for year in range(2024, 2035)]
- months = [str(month).zfill(2) for month in range(1, 13)]
- days = [str(day).zfill(2) for day in range(1, 32)]
- # 定义创建 GUI 的函数
- def create_gui(todo):
- # 创建主窗口
- root = tk.Tk()
- # 设置窗口大小
- root.geometry('800x800')
- # 设置窗口标题
- root.title('待办事项应用')
- # 创建 StringVar 变量来存储选择的日期
- selected_year = StringVar(root)
- # 获取当前日期
- today = datetime.datetime.now()
- # 设置默认年份为当前年份
- selected_year.set(str(today.year))
- # 创建 StringVar 变量来存储选择的月份
- selected_month = StringVar(root)
- # 设置默认月份为当前月份
- selected_month.set(str(today.month).zfill(2))
- # 创建 StringVar 变量来存储选择的日期
- selected_day = StringVar(root)
- # 设置默认日期为当前日期
- selected_day.set(str(today.day).zfill(2))
- # 定义添加任务的 GUI 函数
- def add_task_gui():
- # 获取输入的任务
- task = entry.get()
- # 获取选择的完成时间
- completion_time = f'{selected_year.get()}-{selected_month.get()}-{selected_day.get()}'
- # 获取输入的备注
- remark = remark_entry.get()
- # 检查任务是否为空
- if task:
- # 调用 TodoApp 类的 add_task 方法添加任务
- todo.add_task(task, completion_time, remark)
- # 清空任务输入框
- entry.delete(0, tk.END)
- # 清空备注输入框
- remark_entry.delete(0, tk.END)
- # 更新任务列表
- update_task_list()
- # 保存任务到 Excel 文件
- todo.save_to_excel()
- # 定义删除任务的 GUI 函数
- def delete_task_gui():
- try:
- # 获取选中的任务项
- selected_item = tree.selection()[0]
- # 获取选中任务的索引
- index = int(tree.item(selected_item)['values'][0]) - 1
- # 调用 TodoApp 类的 delete_task 方法删除任务
- todo.delete_task(index)
- # 更新任务列表
- update_task_list()
- except IndexError:
- pass
- # 定义查看任务的 GUI 函数
- def view_tasks_gui():
- # 调用 TodoApp 类的 view_tasks 方法查看任务
- todo.view_tasks()
- # 更新任务列表
- update_task_list()
- # 定义保存任务到 Excel 文件的 GUI 函数
- def save_to_excel_gui():
- # 调用 TodoApp 类的 save_to_excel 方法保存任务到 Excel 文件
- todo.save_to_excel()
- # 定义更新任务列表的函数
- def update_task_list():
- global tree
- # 打印任务列表
- print(f"任务列表: {todo.tasks}")
- # 检查 Treeview 是否已经创建
- if tree is None:
- # 创建 Treeview 组件
- tree = ttk.Treeview(root, columns=('序号', '任务名称', '完成情况', '完成时间', '备注'), show='headings')
- # 设置列标题
- tree.heading('序号', text='序号')
- tree.heading('任务名称', text='任务名称')
- tree.heading('完成情况', text='完成情况')
- tree.heading('完成时间', text='完成时间')
- tree.heading('备注', text='备注')
- # 设置列宽度
- tree.column('序号', width=50)
- tree.column('任务名称', width=200)
- tree.column('完成情况', width=100)
- tree.column('完成时间', width=100)
- tree.column('备注', width=100)
- # 布局 Treeview 组件
- tree.grid(row=3, column=0, columnspan=7, padx=10, pady=10, sticky='nsew')
- # 清空 Treeview 中的所有项
- for i in tree.get_children():
- tree.delete(i)
- # 遍历任务列表并插入到 Treeview 中
- for i, task in enumerate(todo.tasks):
- # 获取任务的完成状态
- status = '已完成' if task['completed'] else '未完成'
- # 获取任务的完成时间
- completion_time = task.get('completion_time', '无')
- # 获取任务的备注
- remark = task.get('remark', '无')
- # 打印插入表格的任务信息
- print(f"插入表格的任务信息: 序号={i + 1}, 任务名称={task['task']}, 完成情况={status}, 完成时间={completion_time}, 备注={remark}")
-
- # 检查任务是否超时且未完成
- is_overdue = False
- if not task['completed'] and completion_time != '无':
- from datetime import datetime
- try:
- due_date = datetime.strptime(completion_time, '%Y-%m-%d')
- if due_date < datetime.now():
- is_overdue = True
- except ValueError:
- pass
-
- # 插入任务信息到 Treeview 中
- if task['completed']:
- tree.insert('', 'end', values=(i + 1, task['task'], status, completion_time, remark), tags=('completed',))
- elif is_overdue:
- tree.insert('', 'end', values=(i + 1, task['task'], status, completion_time, remark), tags=('overdue',))
- else:
- tree.insert('', 'end', values=(i + 1, task['task'], status, completion_time, remark))
-
- # 配置已完成任务的样式
- tree.tag_configure('completed', background='lightgreen')
- # 配置超时任务的样式
- tree.tag_configure('overdue', background='lightcoral')
- # 保存任务到 Excel 文件
- todo.save_to_excel()
- # 定义标记任务为已完成的 GUI 函数
- def mark_task_completed_gui():
- try:
- # 获取选中的任务项
- selected_item = tree.selection()[0]
- # 获取选中任务的索引
- index = int(tree.item(selected_item)['values'][0]) - 1
- # 调用 TodoApp 类的 mark_task_completed 方法标记任务为已完成
- todo.mark_task_completed(index)
- # 更新任务列表
- update_task_list()
- except IndexError:
- pass
- # 界面布局
- label = tk.Label(root, text='请输入任务:')
- entry = tk.Entry(root)
- add_button = tk.Button(root, text='添加任务', command=add_task_gui)
- add_button.grid(row=0, column=0, padx=10, pady=10, sticky='ew')
- label.grid(row=0, column=1, padx=10, pady=10, sticky='ew')
- entry.grid(row=0, column=2, padx=10, pady=10, sticky='ew')
- # 完成时间标签
- completion_time_label = ttk.Label(root, text='完成时间:')
- # 年份选择菜单
- year_menu = OptionMenu(root, selected_year, *years)
- # 月份选择菜单
- month_menu = OptionMenu(root, selected_month, *months)
- # 日期选择菜单
- day_menu = OptionMenu(root, selected_day, *days)
- completion_time_label.grid(row=0, column=3, padx=10, pady=10, sticky='ew')
- year_menu.grid(row=0, column=4, padx=10, pady=10, sticky='ew')
- month_menu.grid(row=0, column=5, padx=10, pady=10, sticky='ew')
- day_menu.grid(row=0, column=6, padx=10, pady=10, sticky='ew')
- # 备注标签
- remark_label = ttk.Label(root, text='备注:')
- # 备注输入框
- remark_entry = tk.Entry(root)
- remark_label.grid(row=1, column=3, padx=10, pady=10, sticky='ew')
- remark_entry.grid(row=1, column=4, columnspan=3, padx=10, pady=10, sticky='ew')
- # 删除任务按钮
- delete_button = tk.Button(root, text='删除任务', command=delete_task_gui)
- delete_button.grid(row=2, column=0, padx=10, pady=10, sticky='ew')
- # 标记为完成按钮
- mark_button = tk.Button(root, text='标记为完成', command=mark_task_completed_gui)
- mark_button.grid(row=2, column=1, padx=10, pady=10, sticky='ew')
- # 查看任务按钮
- view_button = tk.Button(root, text='查看任务', command=view_tasks_gui)
- view_button.grid(row=2, column=2, padx=10, pady=10, sticky='ew')
- # 配置列权重
- root.columnconfigure(0, weight=1)
- root.columnconfigure(1, weight=1)
- root.columnconfigure(2, weight=1)
- root.columnconfigure(3, weight=1)
- root.columnconfigure(4, weight=1)
- root.rowconfigure(3, weight=1)
- # 美化界面
- style = ttk.Style()
- # 设置主题
- style.theme_use('default')
- # 配置按钮样式
- style.configure('TButton', font=('Arial', 12), padding=10)
- # 配置标签样式
- style.configure('TLabel', font=('Arial', 12), padding=10)
- # 配置输入框样式
- style.configure('TEntry', font=('Arial', 12), padding=10)
- # 更新任务列表
- update_task_list()
- # 进入主事件循环
- root.mainloop()
- # 创建 StringVar 变量来存储选择的日期
- selected_year = tk.StringVar(root)
- # 获取当前年份
- current_year = datetime.datetime.now().year
- # 设置默认年份为当前年份
- selected_year.set(current_year)
- # 创建 StringVar 变量来存储选择的月份
- selected_month = tk.StringVar(root)
- # 获取当前月份
- current_month = datetime.datetime.now().month
- # 设置默认月份为当前月份
- selected_month.set(current_month)
- # 创建 StringVar 变量来存储选择的日期
- selected_day = tk.StringVar(root)
- # 获取当前日期
- current_day = datetime.datetime.now().day
- # 设置默认日期为当前日期
- selected_day.set(current_day)
复制代码 |
评分
-
查看全部评分
|