hello,我是H哥,一直在研究AI以及技术的路上。感兴趣的可以关注我,留意最新消息,同时觉得不错的可以给H哥一个支持,关注点赞转发三联!
Python每日一练:做一个桌面的任务小工具,记录今天任务的完成时间。
本次代码使用了tkinter库
tkinter库特点:
GUI开发:提供窗口、按钮、文本框等组件,支持基础的图形界面开发。
跨平台: 基于Tcl/Tk,可在Windows、Linux、macOS运行,外观依系统有所不同。
主要功能说明:
1.界面布局:
- 顶部输入框和添加按钮
- 中间表格显示任务列表(任务名称、状态、已用时间)
- 底部控制按钮(开始、暂停、标记完成
2.核心功能:
- 添加新任务
- 启动/暂停任务计时
- 标记任务完成
- 自动保存和加载任务数据
- 实时计时显示
使用说明:
- 在输入框输入任务名称,点击"添加任务"
- 在列表中选择任务,点击"开始"启动计时
- 点击"暂停"停止当前任务计时
- 完成任务后点击"标记完成"
- 数据会自动保存(每30秒一次),关闭程序时会自动保存
- 数据存储:
使用JSON文件保存任务数据
存储内容包括任务名称、状态、累计时间和开始时间
操作说明:
1、新建一个panel.py文件,输入下面的代码
import tkinter as tk
from tkinter import ttk, messagebox
import json
from datetime import datetime, timedelta
class TaskTimerApp:
# 初始化
def __init__(self, root):
self.root = root
# 面板名称
self.root.title("任务管理面板")
# 面板相对桌面的大小
self.root.geometry("750x450")
# 任务空列表
self.tasks = []
# 初始化当前任务变量
self.current_task = None
self.timer_running = False
# 初始化界面
self.setup_ui()
# 加载保存的数据
self.load_data()
# 面板UI界面功能方法
def setup_ui(self):
# 顶部输入区域
input_frame = ttk.Frame(self.root)
input_frame.pack(pady=10, padx=10, fill=tk.X)
self.task_entry = ttk.Entry(input_frame, width=50)
self.task_entry.pack(side=tk.LEFT, padx=5)
add_btn = ttk.Button(input_frame, text="添加任务", command=self.add_task)
add_btn.pack(side=tk.LEFT, padx=5)
# 任务列表区域
self.tree = ttk.Treeview(self.root, columns=('task_name', 'status', 'time'), show='headings')
self.tree.heading('task_name', text='任务名称')
self.tree.heading('status', text='状态')
self.tree.heading('time', text='已用时间')
self.tree.column('task_name', width=400)
self.tree.column('status', width=150)
self.tree.column('time', width=150)
self.tree.pack(fill=tk.BOTH, expand=True, padx=10, pady=5)
# 控制按钮区域
control_frame = ttk.Frame(self.root)
control_frame.pack(pady=10)
self.start_btn = ttk.Button(control_frame, text="开始", command=self.start_timer)
self.start_btn.pack(side=tk.LEFT, padx=5)
self.pause_btn = ttk.Button(control_frame, text="暂停", command=self.pause_timer)
self.pause_btn.pack(side=tk.LEFT, padx=5)
self.complete_btn = ttk.Button(control_frame, text="标记完成", command=self.mark_complete)
self.complete_btn.pack(side=tk.LEFT, padx=5)
# 定时保存数据
self.root.protocol("WM_DELETE_WINDOW", self.on_close)
self.auto_save()
# 添加任务方法
def add_task(self):
task_name = self.task_entry.get()
if task_name:
task = {
'task_name': task_name,
'status': '未开始',
'time': 0,
'start_time': None
}
self.tasks.append(task)
self.update_tree()
self.task_entry.delete(0, tk.END)
else:
messagebox.showwarning("提示", "任务名称为空!请输入任务名称")
# 更新面板任务树方法
def update_tree(self):
# 清空现有数据
for item in self.tree.get_children():
self.tree.delete(item)
# 插入新数据
for task in self.tasks:
time_str = str(timedelta(seconds=task['time']))
self.tree.insert('', 'end',
values=(task['task_name'], task['status'], time_str))
# 面板开始任务时间方法
def start_timer(self):
selected = self.tree.selection()
if not selected:
return
index = self.tree.index(selected[0])
task = self.tasks[index]
if self.current_task is not None:
self.pause_timer()
if task['status'] != '进行中':
task['status'] = '进行中'
task['start_time'] = datetime.now()
self.current_task = index
self.timer_running = True
self.update_time()
self.update_tree()
# 面板暂停任务时间方法
def pause_timer(self):
if self.current_task is not None and self.timer_running:
task = self.tasks[self.current_task]
task['time'] += (datetime.now() - task['start_time']).seconds
task['status'] = '已暂停'
task['start_time'] = None
self.timer_running = False
self.current_task = None
self.update_tree()
# 面板更新任务时间方法
def update_time(self):
if self.timer_running and self.current_task is not None:
task = self.tasks[self.current_task]
now = datetime.now()
elapsed = (now - task['start_time']).seconds
total_time = task['time'] + elapsed
# 更新当前显示的时间
time_str = str(timedelta(seconds=total_time))
self.tree.item(self.tree.get_children()[self.current_task],
values=('进行中', time_str))
# 每秒更新一次
self.root.after(1000, self.update_time)
# 标记完成方法
def mark_complete(self):
selected = self.tree.selection()
if selected:
index = self.tree.index(selected[0])
self.tasks[index]['status'] = '已完成'
if index == self.current_task:
self.pause_timer()
self.update_tree()
# 自动更新面板方法
def auto_save(self):
self.save_data()
self.root.after(30000, self.auto_save) # 每30秒自动保存
# 保存面板任务数据方法
def save_data(self):
with open('tasks.json', 'w') as f:
json.dump(self.tasks, f, default=str)
# 加载面板任务数据方法
def load_data(self):
try:
with open('tasks.json', 'r') as f:
data = json.load(f)
for task in data:
# 转换时间格式
if isinstance(task['time'], str):
h, m, s = map(int, task['time'].split(':'))
task['time'] = str(h * 3600 + m * 60 + s) + '秒'
else:
task['time'] = int(task['time'])
task['start_time'] = None
self.tasks = data
self.update_tree()
except FileNotFoundError:
pass
def on_close(self):
self.save_data()
self.root.destroy()
if __name__ == "__main__":
# 管理员运行
root = tk.Tk()
# 实例化TaskTimerApp类
app = TaskTimerApp(root)
root.mainloop()
2、打开超级管理员命令行,进入项目的目录下
运行panel.py文件
python panel.py