新手也能懂!用 Python 一步步实现精准闹钟(无额外安装,跨平台可用)
一、先明确:我们需要一个什么样的闹钟?
做之前先想清楚核心需求,避免做无用功:
- 能设置具体时间(比如早上 8 点半、下午 3 点 15 分 10 秒)
- 输入时间时不会因为输错格式崩溃(比如输 “25:61” 会提示错误)
- 到点后能提醒(声音 + 文字,就算没声音也能看到提示)
- 不用装额外软件,复制代码就能运行
- 时间要准,不能差几十秒
- 电脑系统不一样也能⽤(Windows、Mac、Linux 都支持)
二、第一版:先搭个 “能用的基础框架”
1. 核心思路
用 Python 自带的工具实现最基本的功能:
- 用datetime库获取当前时间、识别设置的闹钟时间
- 用playsound库播放提醒音(当时觉得这个库跨平台方便)
- 循环检查当前时间,和设置的时间对上了就触发提醒
2. 基础版代码(新手可直接复制)
import datetime
import time
from playsound import playsound
import os
def get_valid_time():
"""让用户输入正确格式的时间(HH:MM)"""
while True:
alarm_time = input("请输入闹钟时间(格式:HH:MM,比如 08:30):").strip()
try:
# 把输入的“HH:MM”拆成小时和分钟
hour, minute = map(int, alarm_time.split(":"))
# 检查时间是否合理(小时0-23,分钟0-59)
if 0 <= hour < 24 and 0 <= minute < 60:
return hour, minute
else:
print("时间不对哦!小时要在0-23之间,分钟0-59,再试试~")
except:
print("格式错啦!要按“HH:MM”输,比如 08:30,重新来~")
def alarm_clock():
"""闹钟主功能"""
target_hour, target_minute = get_valid_time()
print(f"闹钟已设置好啦!时间是:{target_hour:02d}:{target_minute:02d}")
print("闹钟在运行,别关掉窗口哦...\n")
while True:
# 获取当前时间
now = datetime.datetime.now()
current_hour = now.hour
current_minute = now.minute
# 实时显示当前时间(不刷屏,只更新一行)
print(f"当前时间:{current_hour:02d}:{current_minute:02d}", end="\r")
# 时间对上了就提醒
if current_hour == target_hour and current_minute == target_minute:
print("\n 时间到!闹钟响啦!")
try:
# Windows系统直接发蜂鸣音,其他系统用在线提示音
if os.name == 'nt':
import winsound
winsound.Beep(1000, 3000) # 1000Hz是声音频率,3000ms是响3秒
else:
playsound("https://www.soundjay.com/button/sounds/button-09.mp3")
except:
print(" 提醒!到设定的时间啦~")
break
# 每30秒检查一次时间(避免太占电脑资源)
time.sleep(30)
if __name__ == "__main__":
try:
alarm_clock()
except KeyboardInterrupt:
print("\n\n 闹钟被手动关掉啦!")3. 遇到的两个坑
本来以为这样就能用了,结果实际测试时出了问题:
- 坑 1:装不上playsound库:运行前需要执行pip install playsound,但很多人(尤其是用新版 Python 和 Windows 的)会提示 “安装失败”,原因是这个库的旧版本和新系统不兼容,新手根本不知道怎么解决。
- 坑 2:时间不准:每 30 秒才检查一次时间,比如设置 8:30,可能 8:30:20 才触发,最多差半分钟,对于需要精准提醒的场景(比如赶会议)根本没用。
三、第二版:解决 “装不上软件” 的问题 —— 不用额外库,直接能用
1. 核心思路:抛弃第三方库,用系统自带功能
既然playsound装不上,那就不用它了!每个电脑系统都有自带的 “发声功能”,我们直接调用:
- Windows:用系统内置的winsound库(不用装,Python 自带)发蜂鸣音
- Mac:调用系统自带的 “afplay” 命令,播放系统里的音效
- Linux:调用系统自带的 “aplay” 命令,播放通用提示音
这样一来,不用装任何额外软件,复制代码就能运行。
2. 无依赖版代码(直接运行,不用装东西)
import datetime
import time
import os
import sys
def get_valid_time():
"""让用户输入正确格式的时间(HH:MM)"""
while True:
alarm_time = input("请输入闹钟时间(格式:HH:MM,比如 08:30):").strip()
try:
hour, minute = map(int, alarm_time.split(":"))
if 0 <= hour < 24 and 0 <= minute < 60:
return hour, minute
else:
print("时间不对哦!小时要在0-23之间,分钟0-59,再试试~")
except:
print("格式错啦!要按“HH:MM”输,比如 08:30,重新来~")
def play_alert_sound():
"""不同系统用不同的提醒音(不用额外装软件)"""
if os.name == 'nt': # Windows系统
import winsound
# 连续响3次,每次1秒,中间停0.2秒,更醒目
for _ in range(3):
winsound.Beep(1000, 1000) # 频率1000Hz,响1000ms
time.sleep(0.2)
elif sys.platform == 'darwin': # Mac系统
# 播放Mac自带的“玻璃破碎”音效
os.system('afplay /System/Library/Sounds/Glass.aiff')
else: # Linux系统
# 播放Linux通用提示音
os.system('aplay /usr/share/sounds/alsa/Front_Center.wav 2>/dev/null')
def alarm_clock():
"""主闹钟功能(不用装额外库)"""
target_hour, target_minute = get_valid_time()
print(f"闹钟已设置好啦!时间是:{target_hour:02d}:{target_minute:02d}")
print("闹钟在运行,别关掉窗口哦...\n")
try:
while True:
now = datetime.datetime.now()
current_hour = now.hour
current_minute = now.minute
print(f"当前时间:{current_hour:02d}:{current_minute:02d}", end="\r")
if current_hour == target_hour and current_minute == target_minute:
print("\n" + "="*30)
print(" 时间到!闹钟响啦!")
print("="*30)
try:
play_alert_sound() # 调用上面的发声函数
except:
# 就算没声音,也会连续提示文字,不怕错过
print("\n 重要提醒!到设定的时间啦~")
for _ in range(5):
print(" 时间到!", end=" ")
time.sleep(0.5)
break
time.sleep(30) # 还是30秒检查一次(后面会优化)
except KeyboardInterrupt:
print("\n\n 闹钟被手动关掉啦!")
if __name__ == "__main__":
alarm_clock()3. 这个版本的优点
- 不用装任何额外软件,复制代码保存成.py文件就能运行
- 跨平台兼容,Windows、Mac、Linux 都能用
- 就算电脑没声音(比如静音),也会有文字连续提醒,不会错过
- 输入错误时会友好提示,新手不会慌
四、第三版:解决 “时间不准”—— 秒级精准,不差 1 秒
1. 为什么之前不准?
之前的版本有两个 “拖后腿” 的地方:
- 检查间隔太长:每 30 秒才看一次时间,最多会差 30 秒
- 只看小时和分钟:比如设置 8:30,8:30:00 到 8:30:59 之间都可能触发,不够精准
2. 优化思路
- 把检查间隔缩短到 1 秒(电脑完全能承受,不会卡)
- 支持设置 “秒”(比如 8:30:00),精准到每秒
- 实时显示 “当前时间” 和 “目标时间”,让你能看到倒计时进度
3. 精准版代码(最终好用版)
import datetime
import time
import os
import sys
def get_valid_time():
"""支持两种格式:HH:MM(比如08:30)或 HH:MM:SS(比如08:30:00)"""
while True:
alarm_time = input("请输入闹钟时间(格式:HH:MM 或 HH:MM:SS,比如 08:30 或 08:30:00):").strip()
try:
# 把输入的时间拆成“时、分、秒”
parts = list(map(int, alarm_time.split(":")))
if len(parts) == 2: # 只输了时和分,秒默认0
hour, minute = parts
second = 0
elif len(parts) == 3: # 输了时、分、秒
hour, minute, second = parts
else:
print("格式错啦!只能输HH:MM或HH:MM:SS,比如08:30或08:30:00~")
continue
# 检查时间是否合理
if 0 <= hour < 24 and 0 <= minute < 60 and 0 <= second < 60:
return hour, minute, second
else:
print("时间不对哦!小时0-23,分钟0-59,秒0-59,再试试~")
except:
print("格式错啦!只能输数字+冒号,比如08:30或08:30:00~")
def play_alert_sound():
"""不同系统的提醒音(不用额外装软件)"""
if os.name == 'nt': # Windows
import winsound
for _ in range(3):
winsound.Beep(1000, 800) # 响800ms,间隔0.1秒,更清脆
time.sleep(0.1)
elif sys.platform == 'darwin': # Mac
os.system('afplay /System/Library/Sounds/Glass.aiff 2>/dev/null')
else: # Linux
os.system('aplay /usr/share/sounds/alsa/Front_Center.wav 2>/dev/null')
def alarm_clock():
"""秒级精准的闹钟主功能"""
target_hour, target_minute, target_second = get_valid_time()
# 把目标时间格式化成“HH:MM:SS”,看起来更整齐
target_str = f"{target_hour:02d}:{target_minute:02d}:{target_second:02d}"
print(f"闹钟已设置好啦!时间是:{target_str}")
print("闹钟在运行,别关掉窗口哦...\n")
try:
while True:
# 获取当前时间(精确到秒)
now = datetime.datetime.now()
current_hour = now.hour
current_minute = now.minute
current_second = now.second
# 实时显示当前时间和目标时间(不刷屏)
current_str = f"{current_hour:02d}:{current_minute:02d}:{current_second:02d}"
print(f"当前时间:{current_str} | 目标时间:{target_str}", end="\r")
# 时、分、秒完全对上才触发,精准到1秒
if (current_hour == target_hour and
current_minute == target_minute and
current_second == target_second):
print("\n" + "="*40)
print(" 时间到!闹钟准时响啦!")
print("="*40)
try:
play_alert_sound()
except:
print("\n 重要提醒!到设定的时间啦~")
for _ in range(5):
print(" 时间到!", end=" ")
time.sleep(0.3)
break
# 每1秒检查一次,既精准又不占资源
time.sleep(1)
except KeyboardInterrupt:
print("\n\n 闹钟被手动关掉啦!")
if __name__ == "__main__":
alarm_clock()4. 优化后的亮点
- 精准到秒:设置 8:30:00,就会在 8 点 30 分 0 秒准时响,误差不超过 1 秒
- 输入灵活:可以只输时和分(比如 08:30),也能输秒(比如 14:25:30)
- 直观易懂:实时显示当前时间和目标时间,不用猜还有多久
- 依然不用装额外软件,跨平台能用
五、新手快速上手指南(3 步搞定)
不管你用什么系统,跟着这 3 步走就能用:
- 复制代码:把上面的 “精准版代码” 全选复制
- 保存文件:打开记事本(Windows)或文本编辑(Mac),粘贴代码,保存为alarm.py(注意:文件后缀必须是.py,不是.txt)
- 运行闹钟: 打开终端(Windows 按 Win+R,输 cmd;Mac 按 Command + 空格,输 Terminal) 用cd命令切换到alarm.py保存的文件夹(比如保存在桌面,就输cd 桌面) 输python alarm.py,按回车运行 按照提示输入时间(比如08:30或15:40:20),等待提醒即可
测试小技巧
想验证准不准?可以设置一个 10 秒后的时间:比如现在是 8:30:20,就输入8:30:30,等 10 秒后看是否准时响铃~
六、想让闹钟更好用?这些功能可以加
如果觉得基础版不够用,还能自己扩展这些实用功能:
- 贪睡功能:响铃后问 “是否贪睡 5 分钟?”,选 “是” 就自动把闹钟往后推 5 分钟
- 重复闹钟:设置 “每天 8 点响”“工作日 7 点半响”,不用天天重新设置
- 自定义提醒语:比如输入 “会议开始啦”“该吃药了”,到点后会显示你设置的文字
- 自定义提示音:用自己喜欢的音乐当闹铃(比如把 MP3 文件路径填到代码里)
- 可视化界面:用 Python 的 Tkinter 库做个窗口,不用输命令,点点鼠标就能设置时间
七、总结:新手能学到什么?
这个小项目虽然简单,但能学会 Python 的几个实用技能:
- 处理时间:用datetime库获取、对比时间
- 跨平台适配:判断不同系统,用对应的方法实现功能
- 异常处理:就算输入错、没声音,程序也不会崩溃
- 优化思路:从 “能用” 到 “好用”,一步步解决问题(比如解决安装问题、精准度问题)
对于新手来说,这是一个非常好的实战项目 —— 代码不多,功能实用,还能遇到并解决实际问题。跟着做一遍,不仅能拿到一个自己用的闹钟,还能加深对 Python 的理解~
版权所属:SO JSON在线解析
原文地址:https://www.sojson.com/blog/559.html
转载时必须以链接形式注明原始出处及本声明。
如果本文对你有帮助,那么请你赞助我,让我更有激情的写下去,帮助更多的人。
