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

运行Python闹钟项目时陷入while无限循环,无法执行后续操作

Python闹钟无限循环问题解决

问题描述

运行网上获取的Python闹钟项目时,想加print语句查看变量值,但while循环执行后无法输入任何内容或进行后续操作,哪怕把循环体简化成只获取当前小时,问题依旧,推测是陷入无限循环。原代码如下:

from datetime import datetime   
from playsound import playsound
alarm_time = input("Enter the time of alarm to be set:HH:MM:SS\n")
alarm_hour=alarm_time[0:2]
alarm_minute=alarm_time[3:5]
alarm_seconds=alarm_time[6:8]
alarm_period = alarm_time[9:11].upper()
print("Setting up alarm..")
while True:
    now = datetime.now()
    current_hour = now.strftime("%I")
    current_minute = now.strftime("%M")
    current_seconds = now.strftime("%S")
    current_period = now.strftime("%p")
    if(alarm_period==current_period):
        if(alarm_hour==current_hour):
            if(alarm_minute==current_minute):
                if(alarm_seconds==current_seconds):
                    print("Wake Up!")
                    playsound('audio.mp3')
                    break

问题原因

  1. 无延迟的高频循环:while True里没有任何延迟,程序会以最快速度反复执行循环体,占用几乎全部CPU资源,导致程序失去响应,无法处理输入或其他操作。
  2. 输入格式匹配风险:代码要求输入带AM/PM后缀(比如08:30:00 AM),如果用户输入时没加这部分,alarm_period会是空字符串,永远和系统返回的current_period(AM/PM)不匹配,循环永远无法触发break终止。

解决办法

  1. 添加循环延迟:导入time模块,在循环末尾加time.sleep(1),让程序每秒检查一次时间,大幅降低CPU占用,避免程序卡死。
  2. 增加输入格式校验:强制用户按要求格式输入,避免因输入错误导致循环无法终止。
  3. 合理添加调试语句:把print放在循环内,每秒打印一次当前时间和闹钟时间,方便观察匹配情况,同时因为有延迟不会刷屏。

修改后的代码示例

from datetime import datetime
from playsound import playsound
import time

# 输入格式校验,确保用户按要求输入
while True:
    alarm_time = input("请输入闹钟时间,格式为HH:MM:SS AM/PM:\n")
    # 简单校验格式是否符合要求
    if len(alarm_time) >= 11 and alarm_time[2] == ':' and alarm_time[5] == ':' and alarm_time[8] == ' ':
        break
    print("格式错误,请按要求重新输入!")

alarm_hour = alarm_time[0:2]
alarm_minute = alarm_time[3:5]
alarm_seconds = alarm_time[6:8]
alarm_period = alarm_time[9:11].upper()
print("正在设置闹钟...")

while True:
    now = datetime.now()
    current_hour = now.strftime("%I")
    current_minute = now.strftime("%M")
    current_seconds = now.strftime("%S")
    current_period = now.strftime("%p")
    
    # 调试用打印,每秒输出一次当前状态
    print(f"当前时间:{current_hour}:{current_minute}:{current_seconds} {current_period} | 闹钟时间:{alarm_hour}:{alarm_minute}:{alarm_seconds} {alarm_period}")
    
    # 合并条件判断,代码更简洁
    if alarm_period == current_period and alarm_hour == current_hour and alarm_minute == current_minute and alarm_seconds == current_seconds:
        print("起床啦!")
        playsound('audio.mp3')
        break
    # 每秒检查一次,避免CPU占用过高
    time.sleep(1)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 11:35:34