求助:如何实现Python后台闹钟功能?time.sleep/Timer方案遇阻
问题解决:实现后台闹钟持续打印睡眠内容
原方案问题分析
方案一的问题
sleeping循环内每次调用alarm(),而alarm又递归调用sleeping(),直接导致程序逻辑混乱,陷入无限嵌套alarm里的sleep(5)是阻塞执行的,会打断当前的睡眠打印流程,根本做不到后台触发
方案二的问题
- 创建
Timer时错误传递了alarm(),这会立即执行alarm函数,而非将函数作为参数交给Timer等待定时触发 alarm内再次调用sleeping(),会导致重复启动打印流程,出现重复输出
修正后的代码实现
核心逻辑:用threading.Timer实现后台定时触发,主线程持续运行睡眠打印流程,闹钟仅负责一次性提示。
from time import sleep from threading import Timer def Type(dialog): '''添加打字机效果''' speed = 0.04 # 打字速度 for char in dialog: sleep(speed) print(char, end='', flush=True) print('') # 换行分隔内容 def alarm(): '''闹钟触发函数''' Type("Hey wake up! It's 7!") def sleeping(): for num in range(1, 61): Type(f'Sleeping {num} . . .') # 启动5秒后触发的闹钟,注意传递函数引用而非执行结果 t = Timer(5.0, alarm) t.start() # 主线程持续打印睡眠内容 sleeping()
关键说明
- Timer的第二个参数必须是
alarm(函数对象),不能加括号,否则会直接执行函数而非定时触发 - 闹钟仅执行一次提示,主线程的
sleeping会持续运行完成所有打印,完全符合需求 - 如果需要重复触发闹钟,可在
alarm函数末尾再次启动Timer(本需求无需此操作)
内容的提问来源于stack exchange,提问作者Mujtablue
相关产品推荐
相关产品推荐

