运行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
问题原因
- 无延迟的高频循环:
while True里没有任何延迟,程序会以最快速度反复执行循环体,占用几乎全部CPU资源,导致程序失去响应,无法处理输入或其他操作。 - 输入格式匹配风险:代码要求输入带AM/PM后缀(比如
08:30:00 AM),如果用户输入时没加这部分,alarm_period会是空字符串,永远和系统返回的current_period(AM/PM)不匹配,循环永远无法触发break终止。
解决办法
- 添加循环延迟:导入
time模块,在循环末尾加time.sleep(1),让程序每秒检查一次时间,大幅降低CPU占用,避免程序卡死。 - 增加输入格式校验:强制用户按要求格式输入,避免因输入错误导致循环无法终止。
- 合理添加调试语句:把
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
相关产品推荐
相关产品推荐

