新手也能懂!用 Python 一步步实现精准闹钟(无额外安装,跨平台可用)

JSON 2026-01-09 16:24:45 540

一、先明确:我们需要一个什么样的闹钟?

做之前先想清楚核心需求,避免做无用功:

  1. 能设置具体时间(比如早上 8 点半、下午 3 点 15 分 10 秒)
  2. 输入时间时不会因为输错格式崩溃(比如输 “25:61” 会提示错误)
  3. 到点后能提醒(声音 + 文字,就算没声音也能看到提示)
  4. 不用装额外软件,复制代码就能运行
  5. 时间要准,不能差几十秒
  6. 电脑系统不一样也能⽤(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 步走就能用:

  1. 复制代码:把上面的 “精准版代码” 全选复制
  2. 保存文件:打开记事本(Windows)或文本编辑(Mac),粘贴代码,保存为alarm.py(注意:文件后缀必须是.py,不是.txt)
  3. 运行闹钟: 打开终端(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 秒后看是否准时响铃~

六、想让闹钟更好用?这些功能可以加

如果觉得基础版不够用,还能自己扩展这些实用功能:

  1. 贪睡功能:响铃后问 “是否贪睡 5 分钟?”,选 “是” 就自动把闹钟往后推 5 分钟
  2. 重复闹钟:设置 “每天 8 点响”“工作日 7 点半响”,不用天天重新设置
  3. 自定义提醒语:比如输入 “会议开始啦”“该吃药了”,到点后会显示你设置的文字
  4. 自定义提示音:用自己喜欢的音乐当闹铃(比如把 MP3 文件路径填到代码里)
  5. 可视化界面:用 Python 的 Tkinter 库做个窗口,不用输命令,点点鼠标就能设置时间

七、总结:新手能学到什么?

这个小项目虽然简单,但能学会 Python 的几个实用技能:

  1. 处理时间:用datetime库获取、对比时间
  2. 跨平台适配:判断不同系统,用对应的方法实现功能
  3. 异常处理:就算输入错、没声音,程序也不会崩溃
  4. 优化思路:从 “能用” 到 “好用”,一步步解决问题(比如解决安装问题、精准度问题)

对于新手来说,这是一个非常好的实战项目 —— 代码不多,功能实用,还能遇到并解决实际问题。跟着做一遍,不仅能拿到一个自己用的闹钟,还能加深对 Python 的理解~  


版权所属:SO JSON在线解析

原文地址:https://www.sojson.com/blog/559.html

转载时必须以链接形式注明原始出处及本声明。

本文主题:

如果本文对你有帮助,那么请你赞助我,让我更有激情的写下去,帮助更多的人。

关于作者
一个低调而闷骚的男人。
相关文章
公历农历相互转换教程3教你搞定
Java服务端监控平台设计
Elasticsearch构建电商搜索平台个极有代表性的基础技术架构和算法实践案例
Python元组剖析
Python print() 函数
Nodejs环境安装,Nodejs环境安装篇就够了
jpg怎么转bmp?三教你搞定还免费使用!
Linux 安装 Redis 详细步骤讲解
Myecilpse,Eclipse安装Freemarker插件【附件】
DNS健康检测的原理?它是如何实现的?
最新文章
文件上传漏洞与防御 4058
前端构建工具选型指南:Webpack、Vite、Rollup、esbuild 深度对比 1444
物联网时代2026年时序数据库选型指南 1151
SaaS行业面临AI挑战:从“无限复用”到“灵活适应” 1269
神经网络:从构造到模型训练全链路解析 1168
一文吃透 Redis 核心存储结构:ziplist、listpack 与哈希表扩容 / 并发查询 1593
Linux sudo提权完整指南:从基础用法到生产级安全配置 691
XSS 和 CSRF 的本质区别及开发防御全解析 772
JVM垃圾回收(GC)全维度解析:从原理到调优实战 813
Linux动静态库与ELF加载全解析:从实操制作到底层原理 912
最热文章
免费天气API,天气JSON API,不限次数获取十五天的天气预报 783114
最新MyEclipse8.5注册码,有效期到2020年 (已经更新) 711464
苹果电脑Mac怎么恢复出厂系统?苹果系统怎么重装系统? 679993
Jackson 时间格式化,时间注解 @JsonFormat 用法、时差问题说明 562673
我为什么要选择RabbitMQ ,RabbitMQ简介,各种MQ选型对比 512621
Elasticsearch教程(四) elasticsearch head 插件安装和使用 484794
Jackson 美化输出JSON,优雅的输出JSON数据,格式化输出JSON数据... ... 302947
Java 信任所有SSL证书,HTTPS请求抛错,忽略证书请求完美解决 247433
Elasticsearch教程(一),全程直播(小白级别) 233097
谈谈斐讯路由器劫持,你用斐讯路由器,你需要知道的事情 228329
支付扫码

所有赞助/开支都讲公开明细,用于网站维护:赞助名单查看

查看我的收藏

正在加载... ...