You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python多函数按不同次数重复执行问题:休息提醒程序调试求助

解决休息提醒工具的循环执行与间隔问题

我来帮你搞定这个休息提醒工具的问题!先拆解下你当前代码的核心问题,再一步步改成符合需求的版本:

原代码的问题分析

  • break语句导致循环终止:每个提醒函数里的break会直接跳出整个while循环,哪怕还没达到设定的提醒次数,执行一次后就停止了,自然没法重复提醒。
  • 无间隔逻辑且顺序执行:原代码是先跑完喝水提醒,再跑护眼、运动提醒,完全没按照各自的间隔时间触发,也没法同时运行三个独立的提醒任务。
  • 代码冗余:三个提醒函数的逻辑几乎一致,重复写了很多相同代码。

优化后的解决方案

我们用多线程让三个提醒并行独立运行,同时重构代码逻辑,移除错误的break,添加间隔计时:

import pygame
import time
import threading  # 用于并行处理三个提醒任务

# 通用提醒模板,复用重复逻辑
def reminder(task_name, prompt_text, confirm_key, interval_minutes, total_times):
    pygame.mixer.init()
    count = 0
    while count < total_times:
        # 播放循环提醒音乐
        pygame.mixer.music.load(f"{task_name}.mp3")  # 请根据实际文件名调整,比如你原来的water.mp3.mp3
        pygame.mixer.music.play(-1)
        
        # 等待用户确认
        query = input(prompt_text)
        if query == confirm_key:
            pygame.mixer.music.pause()
            time.sleep(1)
            count += 1
            
            # 未完成全部次数时,等待设定的间隔时间
            if count < total_times:
                print(f"下次{task_name}提醒将在{interval_minutes}分钟后")
                time.sleep(interval_minutes * 60)  # 分钟转秒

# 喝水提醒(调用通用模板,传入专属参数)
def water_reminder():
    reminder("water", "您喝水了吗?(是请输入drank)", "drank", 28, 2)

# 护眼提醒
def eyes_reminder():
    reminder("eyes", "您做护眼操了吗?(是请输入eydone)", "eydone", 30, 2)

# 运动提醒
def exercise_reminder():
    reminder("physical", "您做运动了吗?(是请输入exdone)", "exdone", 48, 2)

if __name__ == "__main__":
    z = input('是否启动程序?(y=是,n=否)')
    if z == 'y':
        # 创建三个线程,分别运行三个提醒任务
        t_water = threading.Thread(target=water_reminder)
        t_eyes = threading.Thread(target=eyes_reminder)
        t_exercise = threading.Thread(target=exercise_reminder)
        
        # 启动所有线程
        t_water.start()
        t_eyes.start()
        t_exercise.start()
        
        # 等待所有提醒任务完成
        t_water.join()
        t_eyes.join()
        t_exercise.join()
        print("所有提醒任务已完成!")
    elif z == 'n':
        print('好的')
    else:
        print('请输入正确指令')

关键改动说明

  1. 通用函数复用:把重复的播放音乐、用户确认逻辑抽成reminder函数,后续修改提醒次数、间隔只需要改参数,不用重复改代码。
  2. 移除错误的break:现在用户确认后,计数加1,若未达到总次数则进入间隔等待,循环会继续执行下一次提醒。
  3. 多线程并行:三个提醒任务各自独立计时,不会互相阻塞。比如喝水提醒每28分钟触发的同时,护眼提醒也在自己的30分钟周期里运行。
  4. 间隔时间处理:把分钟转换成秒(interval_minutes * 60),适配time.sleep()的参数要求。

注意事项

  • 请确保你的音乐文件名和代码中的路径一致,比如原来的water.mp3.mp3要对应修改代码里的文件名。
  • 如果pygame初始化出现问题,可以尝试把pygame.mixer.init()移到主程序开头,避免重复初始化。

内容的提问来源于stack exchange,提问作者ScienceXDream

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 15:17:38