From d697b3f7cfff985422ad5f5809556a28c5bffc31 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20Moran?= Date: Wed, 11 Dec 2024 01:38:08 +0100 Subject: [PATCH] Pomodoro --- app/__pycache__/pomodoro.cpython-313.pyc | Bin 0 -> 8390 bytes app/pomodoro.py | 134 +++++++++++++++++++++++ main.py | 17 ++- 3 files changed, 147 insertions(+), 4 deletions(-) create mode 100644 app/__pycache__/pomodoro.cpython-313.pyc create mode 100644 app/pomodoro.py diff --git a/app/__pycache__/pomodoro.cpython-313.pyc b/app/__pycache__/pomodoro.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c148c317c10350a1ed94aaf032e0e7c1c9f90d15 GIT binary patch literal 8390 zcmb_BZBP_RmR0>(G)>bgDxclOm)a@_2r7)u3d7)_1EUn^%)m@fK^M^4bYoVvqPuq( zdlwhDF&9p3oUxpLZ0E;`5gVtmf5!c#yZhsq`!iMITzAwMaTjs(oXUo{$nS@{5v+x&yfYzPXch85g36z z!w?o~+ZpDxjo41xiJdq49mGM$oy1wr)G>m+k`WvoHiH6jO|c>8DmDf~Hr=i$mvqmJ zB+KHIG@h87FtCg=JB3*vg!XM_j4~uPfhBgqR>=SxAWfWt14@_RgwidzpyUKMltlsu zrDv>ID5_*SvUG`8@Q{+J;*eJ_Ih&YCL=q%19G#KKsv9sSOpb_+%CN)#^?!z;+sudl z81~XnU`Lo3n`_yim76)j4CP=GgJA#zY0*!xL(5bss0Uik+!$iI%+{#SgogYkWYu-d z2rD=QXD9M6GW&u5b`!ShA=uFTPjCrtf$OyK%mzNY^064$!ooC#BEbXviv@3|6D07O zGXcBYgsr-u1SNv6lLh{jCf-oB30d`4{0nPZunDD|sMAuD0^kKq*s2T4HSCO z1NhWh^i2qQbNgxbF-%9+dW3DD!R=WMZZpSWPMrx`^&3iD*is5wg<(B$+lZ|oZF6@l zZ8TWYm=NraP1pev?=gF<8dl~I$^^f#v(pVbQf7_-_C6D~>Y)P`Y(l~=_}eX%ciJ~u z=~i-70Of<`T∨H_5Tv90BZR6SnFtN*{p_I4|N^(Mc9 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 literal 0 HcmV?d00001 diff --git a/app/pomodoro.py b/app/pomodoro.py new file mode 100644 index 0000000..634a313 --- /dev/null +++ b/app/pomodoro.py @@ -0,0 +1,134 @@ +import tkinter as tk +from tkinter import ttk, messagebox +import threading +import time + + +class PomodoroTimer: + def __init__(self, parent): + self.parent = parent + self.work_time = 25 * 60 + self.break_time = 5 * 60 + self.remaining_time = self.work_time + self.is_running = False + self.is_break = False + self.timer_thread = None + + # Interfaz del Pomodoro + self.frame = tk.Frame(parent, bg="white") + self.frame.pack(fill="both", expand=True) + + # Título del temporizador + self.title_label = tk.Label( + self.frame, text="Pomodoro Timer", font=("Helvetica", 18, "bold"), bg="white", fg="#ff6347" + ) + self.title_label.pack(pady=20) + + # Barra de progreso + self.progress = ttk.Progressbar(self.frame, maximum=self.work_time, length=300) + self.progress.pack(pady=10) + + # Label del temporizador + self.timer_label = tk.Label( + self.frame, text=self.format_time(self.remaining_time), font=("Helvetica", 36, "bold"), bg="white", fg="#4caf50" + ) + self.timer_label.pack(pady=10) + + # Contenedor para botones + button_frame = tk.Frame(self.frame, bg="white") + button_frame.pack(pady=20) + + self.start_button = tk.Button( + button_frame, text="Iniciar", command=self.start_timer, bg="#4caf50", fg="white", font=("Helvetica", 12, "bold"), width=10 + ) + self.start_button.grid(row=0, column=0, padx=5) + + self.pause_button = tk.Button( + button_frame, text="Pausar", command=self.pause_timer, bg="#ff9800", fg="white", font=("Helvetica", 12, "bold"), width=10 + ) + self.pause_button.grid(row=0, column=1, padx=5) + + self.reset_button = tk.Button( + button_frame, text="Reiniciar", command=self.reset_timer, bg="#f44336", fg="white", font=("Helvetica", 12, "bold"), width=10 + ) + self.reset_button.grid(row=0, column=2, padx=5) + + # Configuración de tiempos + settings_frame = tk.Frame(self.frame, bg="white") + settings_frame.pack(pady=20) + + self.settings_label = tk.Label( + settings_frame, text="Configurar tiempos (min):", font=("Helvetica", 10), bg="white" + ) + self.settings_label.grid(row=0, column=0, columnspan=2, pady=5) + + tk.Label(settings_frame, text="Trabajo:", font=("Helvetica", 10), bg="white").grid(row=1, column=0, pady=5) + self.work_time_entry = tk.Entry(settings_frame, width=5, justify="center") + self.work_time_entry.insert(0, "25") + self.work_time_entry.grid(row=1, column=1, pady=5) + + tk.Label(settings_frame, text="Descanso:", font=("Helvetica", 10), bg="white").grid(row=2, column=0, pady=5) + self.break_time_entry = tk.Entry(settings_frame, width=5, justify="center") + self.break_time_entry.insert(0, "5") + self.break_time_entry.grid(row=2, column=1, pady=5) + + self.apply_button = tk.Button( + settings_frame, text="Aplicar", command=self.apply_settings, bg="#2196f3", fg="white", font=("Helvetica", 10, "bold") + ) + self.apply_button.grid(row=3, column=0, columnspan=2, pady=10) + + def start_timer(self): + if not self.is_running: + self.is_running = True + self.timer_thread = threading.Thread(target=self.run_timer, daemon=True) + self.timer_thread.start() + + def pause_timer(self): + self.is_running = False + + def reset_timer(self): + self.is_running = False + self.remaining_time = self.work_time if not self.is_break else self.break_time + self.update_timer_label() + self.progress["value"] = 0 + + def apply_settings(self): + try: + work_minutes = int(self.work_time_entry.get()) + break_minutes = int(self.break_time_entry.get()) + self.work_time = work_minutes * 60 + self.break_time = break_minutes * 60 + self.reset_timer() + except ValueError: + messagebox.showerror("Error", "Por favor, ingresa valores numéricos válidos.") + + def run_timer(self): + while self.remaining_time > 0 and self.is_running: + time.sleep(1) + self.remaining_time -= 1 + self.update_timer_label() + self.progress["value"] = (self.work_time if not self.is_break else self.break_time) - self.remaining_time + + if self.remaining_time == 0 and self.is_running: + self.is_running = False + self.is_break = not self.is_break + # Actualizar el tiempo restante según la nueva fase + self.remaining_time = self.break_time if self.is_break else self.work_time + self.progress["maximum"] = self.break_time if self.is_break else self.work_time # Actualiza el máximo + self.update_timer_label() + self.progress["value"] = 0 # Reinicia la barra + messagebox.showinfo( + "Pomodoro Finalizado", + "¡Tiempo de descanso!" if self.is_break else "¡Tiempo de trabajar!", + ) + if self.is_running: + self.start_timer() + + + def update_timer_label(self): + self.timer_label.config(text=self.format_time(self.remaining_time)) + + @staticmethod + def format_time(seconds): + minutes, seconds = divmod(seconds, 60) + return f"{minutes:02d}:{seconds:02d}" diff --git a/main.py b/main.py index 071b751..768ef98 100644 --- a/main.py +++ b/main.py @@ -4,6 +4,7 @@ from tkinter import ttk # Importar el widget ttk from tkinter import messagebox from app import monitorization from app import panel_derecho +from app import pomodoro import threading import time import datetime @@ -105,11 +106,19 @@ notebook.pack(fill="both", expand=True) # Crear cinco solapas for i in range(1, 6): tab = ttk.Frame(notebook) + if i == 1: + notebook.add(tab, text="Scrapping", padding=4) + elif i == 2: # Identificar la solapa 2 + notebook.add(tab, text="Pomodoro", padding=4) + pomodoro.PomodoroTimer(tab) + elif i == 3: + notebook.add(tab, text="Gestor de tareas", padding=4) + else: + notebook.add(tab, text=f"Solapa {i}", padding=4) + # Añadir un Label en cada solapa para diferenciarla + label = ttk.Label(tab, text=f"Contenido de la Solapa {i}") + label.pack(pady=10) - notebook.add(tab, text=f"Solapa {i}", padding=4) - # Añadir un Label en cada solapa para diferenciarla - label = ttk.Label(tab, text=f"Contenido de la Solapa {i}") - label.pack(pady=10) # Barra de estado # Dividir la barra de estado en 4 labels