Есть ли эффективный способ назначить звуки (tick.wav, end_break.wav, end_task.wav)?Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Есть ли эффективный способ назначить звуки (tick.wav, end_break.wav, end_task.wav)?

Сообщение Anonymous »

Для проекта я создаю приложение Pomodoro для организации настраиваемого времени обучения. Я достиг точки, где я застрял. В принципе он не возвращает ошибки, а окно приложения открывается, и задачи могут быть настроены. Но есть проблемы:
задачи не запланированы правильно, если я запланирую задачу и перерыв и сохраняю ее, второй не появляется, и мне нужно снова отредактировать задачу, но мне не удастся перетащить Порядок задач на перестройку их полюбил из главного окна.
Второй выпуск - это звуки. Я не могу заставить их звучать правильно в нужное время, т. Е. Тик не звучит, вместо этого звучит конец задачи и т. Д. Проблемы У кого -нибудь есть решение, чтобы приложение работало нормально?
Спасибо < /p>

Код: Выделить всё

import tkinter as tk
from tkinter import messagebox, simpledialog
from PIL import Image, ImageTk, ImageDraw
import os
import pygame

# Definición de colores
COLORS = {
"background": "#2E3440",
"foreground": "#D8DEE9",
"button_bg": "#4C566A",
"button_fg": "#ECEFF4",
"active_bg": "#5E81AC",
"listbox_bg": "#3B4252",
"listbox_fg": "#E5E9F0",
}

class PomodoroApp:
def __init__(self, root):
self.root = root
self.root.title("Temporizador Pomodoro Profesional")
self.root.geometry("700x600")
self.root.configure(bg=COLORS["background"])
self.colors = COLORS
self.tick_sound_playing = False

# Inicializar pygame y cargar los sonidos
pygame.mixer.init()
self.load_sounds()

# Cargar el logotipo
try:
script_dir = os.path.dirname(os.path.abspath(__file__))
logo_path = os.path.join(
script_dir, 'resources', 'images', '/Users/sdcarr/Desktop/pomodoro/pomodoro_project/resources/images/logo.png')
self.logo_image = Image.open(logo_path)
self.logo_image = self.create_circular_logo(self.logo_image, 100)
self.logo = ImageTk.PhotoImage(self.logo_image)
except FileNotFoundError:
print(f"Logotipo no encontrado en: {logo_path}")
self.logo = None
except Exception as e:
print(f"Error al cargar el logotipo: {str(e)}")
self.logo = None

self.setup_ui()
self.initialize_schedule()

def load_sounds(self):
try:
script_dir = os.path.dirname(os.path.abspath(__file__))
tick_sound_path = os.path.normpath(os.path.join(
script_dir, 'resources', 'sounds', '/Users/sdcarr/Desktop/pomodoro/pomodoro_project/resources/sounds /tick.wav'))
end_break_sound_path = os.path.normpath(os.path.join(
script_dir, 'resources', 'sounds', '/Users/sdcarr/Desktop/pomodoro/pomodoro_project/resources/sounds /end_break.wav'))
end_task_sound_path = os.path.normpath(os.path.join(
script_dir, 'resources', 'sounds', '/Users/sdcarr/Desktop/pomodoro/pomodoro_project/resources/sounds /end_task.wav'))

if not os.path.exists(tick_sound_path):
raise FileNotFoundError(
f"Archivo no encontrado: {tick_sound_path}")
if not os.path.exists(end_break_sound_path):
raise FileNotFoundError(
f"Archivo no encontrado: {end_break_sound_path}")
if not os.path.exists(end_task_sound_path):
raise FileNotFoundError(
f"Archivo no encontrado: {end_task_sound_path}")

self.tick_sound = pygame.mixer.Sound(tick_sound_path)
self.end_break_sound = pygame.mixer.Sound(end_break_sound_path)
self.end_task_sound = pygame.mixer.Sound(end_task_sound_path)
print(
f"Sonidos cargados correctamente:\n{tick_sound_path}\n{end_break_sound_path}\n{end_task_sound_path}")
except Exception as e:
print(f"Error al cargar sonidos: {str(e)}")
self.tick_sound = None
self.end_break_sound = None
self.end_task_sound = None

def play_tick_sound(self):
"""Inicia el sonido del tick en loop"""
if self.tick_sound and not self.tick_sound_playing:
self.tick_sound.set_volume(0.3)
self.tick_sound.play(loops=-1)
self.tick_sound_playing = True

def stop_tick_sound(self):
"""Detiene el sonido del tick"""
if self.tick_sound and self.tick_sound_playing:
self.tick_sound.stop()
self.tick_sound_playing = False

def start_timer(self):
"""Inicia el temporizador y el sonido del tick"""
if not self.is_running:
if not self.schedule:  # Verificar si no hay tareas
messagebox.showinfo(
"Sin tareas", "No hay tareas configuradas.  Añade tareas para comenzar.")
return
self.is_running = True
self.play_tick_sound()
self.update_timer()

def update_timer(self):
"""Actualiza el temporizador cada segundo"""
if self.is_running:
if self.time_left > 0:
self.time_left -= 1
self.label.config(text=self.format_time(self.time_left))
self.root.after(1000, self.update_timer)
else:
self.stop_tick_sound()
self.next_step()

def stop_timer(self):
"""Detiene el temporizador y el sonido"""
if self.is_running:
self.is_running = False
self.stop_tick_sound()

def next_step(self):
"""Maneja la transición entre tareas y pomodoros"""
self.stop_tick_sound()
if not self.schedule:  # Verificar si no hay tareas
self.stop_timer()
return

current_task = self.schedule[self.current_task_index]
if current_task.get("is_break", False):
# Reproducir sonido de fin de descanso
if self.end_break_sound:
self.end_break_sound.play()
else:
# Reproducir sonido de fin de tarea
if self.end_task_sound:
self.end_task_sound.play()

self.move_to_next_task()

def move_to_next_task(self):
self.current_task_index += 1
if self.current_task_index <  len(self.schedule):
self.time_left = self.schedule[self.current_task_index]["duration"]
self.task_label.config(
text=self.schedule[self.current_task_index]["task"])
self.update_schedule_listbox()
self.root.after(1000, self.update_timer)
else:
self.stop_timer()

def create_circular_logo(self, image, size):
"""Crear una imagen circular"""
image = image.resize((size, size), Image.LANCZOS)
mask = Image.new('L', (size, size), 0)
draw = ImageDraw.Draw(mask)
draw.ellipse((0, 0, size, size), fill=255)
output = Image.new('RGBA', (size, size), (0, 0, 0, 0))
output.paste(image, (0, 0), mask)
return output

def setup_ui(self):
"""Configurar la interfaz de usuario"""
self.main_frame = tk.Frame(self.root, bg=self.colors["background"])
self.main_frame.pack(fill=tk.BOTH, expand=True, padx=20, pady=20)

if self.logo:
self.logo_label = tk.Label(
self.main_frame, image=self.logo, bg=self.colors["background"])
self.logo_label.pack(pady=10)

self.label = tk.Label(self.main_frame, text="00:00", font=(
"Helvetica", 48), bg=self.colors["background"], fg=self.colors["foreground"])
self.label.pack(pady=20)

self.task_label = tk.Label(self.main_frame, text="No hay tareas", font=(
"Helvetica", 24), bg=self.colors["background"], fg=self.colors["foreground"])
self.task_label.pack(pady=10)

self.create_buttons()
self.create_schedule_list()

def create_buttons(self):
self.button_frame = tk.Frame(
self.main_frame, bg=self.colors["background"])
self.button_frame.pack(pady=10)

button_styles = [
{
"text": "▶ Iniciar",
"command": self.start_timer,
"bg": "#A3BE8C",
"fg": "#2E3440",
"hover_bg": "#8FAF7C",
"hover_fg": "#2E3440"
},
{
"text": "⏸ Detener",
"command": self.stop_timer,
"bg": "#BF616A",
"fg": "#2E3440",
"hover_bg": "#AF515A",
"hover_fg": "#2E3440"
},
{
"text": "✎ Editar Horario",
"command": self.edit_schedule,
"bg": "#5E81AC",
"fg": "#2E3440",
"hover_bg": "#4E719C",
"hover_fg": "#2E3440"
},
{
"text": "🔄 Reiniciar",
"command": self.reset_schedule,
"bg": "#D08770",
"fg": "#2E3440",
"hover_bg": "#B07660",
"hover_fg":  "#2E3440"
}
]

for style in button_styles:
button = tk.Button(
self.button_frame,
text=style["text"],
command=style["command"],
font=("Helvetica", 14),
width=12,
relief=tk.RAISED,
borderwidth=2,
cursor="hand2"
)
button.configure(
bg=style["bg"],
fg=style["fg"],
activebackground=style["hover_bg"],
activeforeground=style["hover_fg"]
)
button.pack(side=tk.LEFT, padx=10)

def create_schedule_list(self):
self.schedule_frame = tk.Frame(
self.main_frame, bg=self.colors["background"])
self.schedule_frame.pack(fill=tk.BOTH, expand=True, pady=20)

self.schedule_label = tk.Label(self.schedule_frame, text="Cronograma", font=(
"Helvetica", 18), bg=self.colors["background"], fg=self.colors["foreground"])
self.schedule_label.pack()

self.schedule_listbox = tk.Listbox(self.schedule_frame, font=(
"Helvetica", 12), bg=self.colors["listbox_bg"], fg=self.colors["listbox_fg"], selectbackground=self.colors["active_bg"])
self.schedule_listbox.pack(fill=tk.BOTH, expand=True)

def initialize_schedule(self):
"""Inicializa la lista de tareas vacía"""
self.schedule = []
self.current_task_index = 0
self.time_left = 0
self.is_running = False
self.update_schedule_listbox()

def format_time(self, seconds):
minutes, seconds = divmod(seconds, 60)
return f"{minutes:02}:{seconds:02}"

def edit_schedule(self):
edit_window = tk.Toplevel(self.root)
edit_window.title("Editar Horario")
edit_window.geometry("400x300")
edit_window.configure(bg=self.colors["background"])

edit_frame = tk.Frame(edit_window, bg=self.colors["background"])
edit_frame.pack(fill=tk.BOTH, expand=True, padx=20, pady=20)

tk.Label(edit_frame, text="Editar Tareas", font=("Helvetica", 18),
bg=self.colors["background"], fg=self.colors["foreground"]).pack(pady=10)

self.edit_listbox = tk.Listbox(edit_frame, font=(
"Helvetica", 12), bg=self.colors["listbox_bg"], fg=self.colors["listbox_fg"], selectbackground=self.colors["active_bg"])
self.edit_listbox.pack(fill=tk.BOTH, expand=True)

if not self.schedule:
self.edit_listbox.insert(tk.END, "No hay tareas configuradas")
else:
for task in self.schedule:
self.edit_listbox.insert(
tk.END, f"{task['task']} - {self.format_time(task['duration'])}")

button_frame = tk.Frame(edit_frame, bg=self.colors["background"])
button_frame.pack(pady=10)

tk.Button(button_frame, text="➕ Añadir tarea", command=self.add_task, bg=self.colors["button_bg"], fg=self.colors["button_fg"], font=(
"Helvetica", 12), activebackground=self.colors["active_bg"]).pack(side=tk.LEFT, padx=5)
tk.Button(button_frame, text="➖ Eliminar tarea", command=self.remove_task, bg=self.colors["button_bg"], fg=self.colors["button_fg"], font=(
"Helvetica", 12), activebackground=self.colors["active_bg"]).pack(side=tk.LEFT, padx=5)
tk.Button(button_frame, text="💾 Guardar cambios", command=lambda:  self.save_changes(edit_window), bg=self.colors["button_bg"], fg=self.colors["button_fg"], font=(
"Helvetica", 12), activebackground=self.colors["active_bg"]).pack(side=tk.LEFT, padx=5)

def add_task(self):
task_name = simpledialog.askstring(
"Añadir tarea", "Nombre de la tarea:")
if task_name:
task_duration = simpledialog.askinteger(
"Añadir tarea", "Duración (minutos):", minvalue=1, maxvalue=120)
if task_duration:
is_break = messagebox.askyesno(
"Tipo de tarea", "¿Es esta tarea un descanso?")
self.schedule.append({
"task": task_name,
"duration": task_duration * 60,
"is_break": is_break
})
self.edit_listbox.insert(
tk.END, f"{task_name} - {self.format_time(task_duration * 60)}")

def remove_task(self):
selected_index = self.edit_listbox.curselection()
if selected_index:
self.schedule.pop(selected_index[0])
self.edit_listbox.delete(selected_index)

def save_changes(self, edit_window):
self.update_schedule_listbox()
edit_window.destroy()

def reset_schedule(self):
self.initialize_schedule()
self.update_schedule_listbox()
self.stop_timer()
self.label.config(text="00:00")
self.task_label.config(text="No hay tareas")

def update_schedule_listbox(self):
self.schedule_listbox.delete(0, tk.END)
if not self.schedule:
self.schedule_listbox.insert(tk.END, "No hay tareas configuradas")
else:
for i, task in enumerate(self.schedule):
task_text = f"{task['task']} - {self.format_time(task['duration'])}"
if i == self.current_task_index:
task_text = "➤ " + task_text
self.schedule_listbox.insert(tk.END, task_text)

if __name__ == "__main__":
root = tk.Tk()
app = PomodoroApp(root)
root.mainloop()

Приложение открывается правильно, и консоль не возвращает ошибки, но, очевидно, что -то не очень хорошо спроектировано со звуками и редактором задач.

Подробнее здесь: https://stackoverflow.com/questions/794 ... eak-wav-en
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Есть ли эффективный способ назначить звуки (tick.wav, end_break.wav, end_task.wav)?
    Anonymous » » в форуме Python
    0 Ответы
    22 Просмотры
    Последнее сообщение Anonymous
  • Есть ли эффективный способ назначить звуки (tick.wav, end_break.wav, end_task.wav)?
    Anonymous » » в форуме Python
    0 Ответы
    40 Просмотры
    Последнее сообщение Anonymous
  • Word-break:break-all для заголовков столбцов jqxgrid
    Anonymous » » в форуме Jquery
    0 Ответы
    42 Просмотры
    Последнее сообщение Anonymous
  • Firefox-CSS Word Break: Break-All нестабильный
    Anonymous » » в форуме CSS
    0 Ответы
    8 Просмотры
    Последнее сообщение Anonymous
  • Почему «<br class =« break » />» не вызывает разрыва линии в гибком контейнере, но «<span class = break />» делает? [зак
    Anonymous » » в форуме CSS
    0 Ответы
    1 Просмотры
    Последнее сообщение Anonymous

Вернуться в «Python»