四时宝库

程序员的知识宝库

Python每日一练| 做一个桌面的任务小工具

hello,我是H哥,一直在研究AI以及技术的路上。感兴趣的可以关注我,留意最新消息,同时觉得不错的可以给H哥一个支持,关注点赞转发三联!

Python每日一练:做一个桌面的任务小工具,记录今天任务的完成时间。

本次代码使用了tkinter库

tkinter库特点:

GUI开发:提供窗口、按钮、文本框等组件,支持基础的图形界面开发。

跨平台: 基于Tcl/Tk,可在Windows、Linux、macOS运行,外观依系统有所不同。

主要功能说明:

1.界面布局:

  • 顶部输入框和添加按钮
  • 中间表格显示任务列表(任务名称、状态、已用时间)
  • 底部控制按钮(开始、暂停、标记完成

2.核心功能:

  • 添加新任务
  • 启动/暂停任务计时
  • 标记任务完成
  • 自动保存和加载任务数据
  • 实时计时显示

使用说明:

  1. 在输入框输入任务名称,点击"添加任务"
  2. 在列表中选择任务,点击"开始"启动计时
  3. 点击"暂停"停止当前任务计时
  4. 完成任务后点击"标记完成"
  5. 数据会自动保存(每30秒一次),关闭程序时会自动保存
  6. 数据存储:

使用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

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言
    友情链接