diff --git a/app/__pycache__/pomodoro.cpython-313.pyc b/app/__pycache__/pomodoro.cpython-313.pyc new file mode 100644 index 0000000..c148c31 Binary files /dev/null and b/app/__pycache__/pomodoro.cpython-313.pyc differ 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