Тайм-трекер продуктивности

Тайм-трекер продуктивности


import tkinter as tk

from datetime import datetime

import pandas as pd

import matplotlib.pyplot as plt

import os


activities = ['Работа', 'Отдых', 'Прокрастинация']

data_file = 'activities_log.csv'


# Начальные данные

current_activity = None

start_time = None


def switch_activity(activity):

  global current_activity, start_time


  now = datetime.now()


  if current_activity is not None and start_time is not None:

    duration = (now - start_time).total_seconds() / 60 # в минутах

    save_activity(current_activity, duration)


  current_activity = activity

  start_time = now

  status_label.config(text=f"Текущая активность: {activity}")


def save_activity(activity, duration):

  df = pd.DataFrame([{

    'timestamp': datetime.now(),

    'activity': activity,

    'duration_min': round(duration, 2)

  }])

  df.to_csv(data_file, mode='a', header=not os.path.exists(data_file), index=False)


def show_stats():

  if not os.path.exists(data_file):

    print("Нет данных")

    return


  df = pd.read_csv(data_file)

  day = datetime.now().date()

  df['timestamp'] = pd.to_datetime(df['timestamp'])

  df = df[df['timestamp'].dt.date == day]


  summary = df.groupby('activity')['duration_min'].sum()


  # Построение круговой диаграммы

  plt.figure(figsize=(6, 6))

  plt.pie(summary, labels=summary.index, autopct='%1.1f%%', startangle=90)

  plt.title(f'Продуктивность за {day}')

  plt.tight_layout()

  plt.show()


# GUI

root = tk.Tk()

root.title("Трекер продуктивности")


status_label = tk.Label(root, text="Выберите активность", font=("Arial", 14))

status_label.pack(pady=10)


for act in activities:

  tk.Button(root, text=act, font=("Arial", 12), width=20,

       command=lambda a=act: switch_activity(a)).pack(pady=5)


tk.Button(root, text="Показать статистику", command=show_stats, bg='lightgreen').pack(pady=15)


root.mainloop()

Report Page