如何编写闹钟管理脚本

wen 实用脚本 26

本文目录导读:

如何编写闹钟管理脚本

  1. Python版本(推荐)
  2. Shell版本(简单任务提醒)
  3. 使用方法
  4. 功能特点

我来帮你编写一个闹钟管理脚本,这里提供Python和Shell两种版本:

Python版本(推荐)

#!/usr/bin/env python3
"""
闹钟管理脚本
功能:设置、查看、删除闹钟,支持多种闹钟类型
"""
import json
import os
import time
import threading
import platform
import subprocess
from datetime import datetime, timedelta
from pathlib import Path
class AlarmManager:
    def __init__(self, storage_file="alarms.json"):
        self.storage_file = Path(storage_file)
        self.alarms = self.load_alarms()
        self.running = False
    def load_alarms(self):
        """加载闹钟数据"""
        if self.storage_file.exists():
            try:
                with open(self.storage_file, 'r') as f:
                    return json.load(f)
            except json.JSONDecodeError:
                print("警告:闹钟文件损坏,将创建新的闹钟列表")
        return []
    def save_alarms(self):
        """保存闹钟数据"""
        with open(self.storage_file, 'w') as f:
            json.dump(self.alarms, f, indent=2, ensure_ascii=False)
    def add_alarm(self, time_str, message="起床啦!", repeat=False, sound=True):
        """添加闹钟
        time_str: 时间字符串,格式 HH:MM
        message: 闹钟消息
        repeat: 是否重复(每天)
        sound: 是否播放声音
        """
        try:
            # 验证时间格式
            alarm_time = datetime.strptime(time_str, "%H:%M")
            alarm = {
                "id": len(self.alarms) + 1,
                "time": time_str,
                "message": message,
                "repeat": repeat,
                "sound": sound,
                "enabled": True,
                "created_at": datetime.now().strftime("%Y-%m-%d %H:%M:%S")
            }
            self.alarms.append(alarm)
            self.save_alarms()
            print(f"✅ 闹钟已添加:{time_str} - {message}")
            return True
        except ValueError:
            print("❌ 时间格式错误,请使用 HH:MM 格式(如 07:30)")
            return False
    def list_alarms(self):
        """列出所有闹钟"""
        if not self.alarms:
            print("📋 暂无闹钟")
            return
        print("\n📋 闹钟列表:")
        print("-" * 50)
        for alarm in self.alarms:
            status = "🟢" if alarm["enabled"] else "🔴"
            repeat_mark = "🔁" if alarm["repeat"] else "🔂"
            sound_mark = "🔊" if alarm["sound"] else "🔇"
            print(f"{status} ID:{alarm['id']} | {alarm['time']} | {alarm['message']} | {repeat_mark}{sound_mark}")
        print("-" * 50)
    def delete_alarm(self, alarm_id):
        """删除闹钟"""
        for i, alarm in enumerate(self.alarms):
            if alarm["id"] == alarm_id:
                self.alarms.pop(i)
                self.save_alarms()
                print(f"🗑️ 闹钟 {alarm_id} 已删除")
                return True
        print(f"❌ 未找到 ID 为 {alarm_id} 的闹钟")
        return False
    def toggle_alarm(self, alarm_id):
        """启用/禁用闹钟"""
        for alarm in self.alarms:
            if alarm["id"] == alarm_id:
                alarm["enabled"] = not alarm["enabled"]
                self.save_alarms()
                status = "启用" if alarm["enabled"] else "禁用"
                print(f"🔄 闹钟 {alarm_id} 已{status}")
                return True
        print(f"❌ 未找到 ID 为 {alarm_id} 的闹钟")
        return False
    def play_sound(self):
        """播放声音"""
        system = platform.system().lower()
        try:
            if system == "darwin":  # macOS
                subprocess.run(["afplay", "/System/Library/Sounds/Submarine.aiff"], 
                             timeout=5)
            elif system == "linux":
                # 尝试多种方式播放声音
                try:
                    subprocess.run(["paplay", "/usr/share/sounds/freedesktop/stereo/alarm-clock-elapsed.oga"], 
                                 timeout=5)
                except:
                    # 使用系统蜂鸣声
                    print('\a')
            elif system == "windows":
                import winsound
                winsound.Beep(1000, 500)  # 频率1000Hz,持续500ms
        except Exception as e:
            print(f"⚠️ 播放声音失败:{e}")
    def check_alarms(self):
        """检查闹钟是否到时间"""
        while self.running:
            now = datetime.now()
            current_time = now.strftime("%H:%M")
            for alarm in self.alarms:
                if not alarm["enabled"]:
                    continue
                if alarm["time"] == current_time:
                    print(f"\n⏰ 闹钟时间到!ID:{alarm['id']} - {alarm['message']}")
                    if alarm["sound"]:
                        self.play_sound()
                    # 如果不是重复闹钟,自动禁用
                    if not alarm["repeat"]:
                        alarm["enabled"] = False
                        self.save_alarms()
            # 每30秒检查一次
            time.sleep(30)
    def start(self):
        """启动闹钟监控"""
        if self.alarms:
            print("🚀 闹钟监控已启动")
            self.running = True
            thread = threading.Thread(target=self.check_alarms, daemon=True)
            thread.start()
            try:
                while True:
                    time.sleep(1)
            except KeyboardInterrupt:
                self.stop()
        else:
            print("📋 没有闹钟需要监控")
    def stop(self):
        """停止闹钟监控"""
        self.running = False
        print("\n🛑 闹钟监控已停止")
def main():
    """主函数"""
    manager = AlarmManager()
    print("=" * 50)
    print("⏰ 闹钟管理脚本")
    print("=" * 50)
    while True:
        print("\n📌 命令菜单:")
        print("1. 添加闹钟")
        print("2. 查看闹钟")
        print("3. 删除闹钟")
        print("4. 启用/禁用闹钟")
        print("5. 启动监控")
        print("6. 退出")
        choice = input("\n请输入选择 (1-6): ").strip()
        if choice == "1":
            time_str = input("请输入时间 (HH:MM): ").strip()
            message = input("请输入提醒信息 (默认: 起床啦!): ").strip() or "起床啦!"
            repeat = input("是否每天重复?(y/n, 默认: n): ").strip().lower() == "y"
            sound = input("是否播放声音?(y/n, 默认: y): ").strip().lower() != "n"
            manager.add_alarm(time_str, message, repeat, sound)
        elif choice == "2":
            manager.list_alarms()
        elif choice == "3":
            manager.list_alarms()
            try:
                alarm_id = int(input("请输入要删除的闹钟ID: "))
                manager.delete_alarm(alarm_id)
            except ValueError:
                print("❌ 请输入有效的ID")
        elif choice == "4":
            manager.list_alarms()
            try:
                alarm_id = int(input("请输入要切换状态的闹钟ID: "))
                manager.toggle_alarm(alarm_id)
            except ValueError:
                print("❌ 请输入有效的ID")
        elif choice == "5":
            manager.start()
        elif choice == "6":
            print("👋 再见!")
            break
        else:
            print("❌ 无效选择,请重新输入")
if __name__ == "__main__":
    main()

Shell版本(简单任务提醒)

#!/bin/bash
# alarm.sh - 简单的闹钟脚本
# 闹钟存储文件
ALARM_FILE="$HOME/.alarms.json"
# 添加闹钟
add_alarm() {
    local time=$1
    local message=$2
    # 时间格式验证
    if [[ ! $time =~ ^[0-9]{2}:[0-9]{2}$ ]]; then
        echo "❌ 时间格式错误,请使用 HH:MM 格式"
        return 1
    fi
    # 创建JSON格式闹钟
    local alarm="{\"time\":\"$time\",\"message\":\"$message\",\"enabled\":true}"
    # 存储闹钟
    if [ -f "$ALARM_FILE" ]; then
        # 在现有关闭括号前插入新闹钟
        sed -i 's/]/  ,'$alarm'\n]/' "$ALARM_FILE"
    else
        echo "[$alarm]" > "$ALARM_FILE"
    fi
    echo "✅ 闹钟已添加:$time - $message"
}
# 查看闹钟
list_alarms() {
    if [ ! -f "$ALARM_FILE" ]; then
        echo "📋 暂无闹钟"
        return
    fi
    echo "📋 闹钟列表:"
    cat "$ALARM_FILE" | python3 -c "
import json, sys
try:
    alarms = json.load(sys.stdin)
    for i, alarm in enumerate(alarms, 1):
        status = '🟢' if alarm.get('enabled', True) else '🔴'
        print(f'{status} {i}. {alarm[\"time\"]} - {alarm[\"message\"]}')
except:
    print('读取闹钟失败')
"
}
# 删除闹钟
delete_alarm() {
    local id=$1
    python3 -c "
import json
with open('$ALARM_FILE', 'r') as f:
    alarms = json.load(f)
if 1 <= $id <= len(alarms):
    deleted = alarms.pop($id - 1)
    with open('$ALARM_FILE', 'w') as f:
        json.dump(alarms, f, indent=2)
    print(f'✅ 闹钟已删除: {deleted[\"time\"]} - {deleted[\"message\"]}')
else:
    print('❌ 无效ID')
"
}
# 监控闹钟
monitor_alarms() {
    echo "🚀 闹钟监控已启动 (按 Ctrl+C 停止)"
    while true; do
        if [ -f "$ALARM_FILE" ]; then
            local current_time=$(date +%H:%M)
            # 检查闹钟是否到时间
            python3 -c "
import json, time, platform, subprocess
with open('$ALARM_FILE', 'r') as f:
    alarms = json.load(f)
current_time = '$current_time'
for alarm in alarms:
    if alarm.get('enabled', True) and alarm['time'] == current_time:
        print(f'⏰ 闹钟时间到!{alarm[\"message\"]}')
        # 播放声音
        system = platform.system().lower()
        try:
            if system == 'darwin':
                subprocess.run(['afplay', '/System/Library/Sounds/Submarine.aiff'], timeout=3)
            elif system == 'linux':
                subprocess.run(['paplay', '/usr/share/sounds/freedesktop/stereo/alarm-clock-elapsed.oga'], timeout=3)
            elif system == 'windows':
                import winsound
                winsound.Beep(1000, 500)
        except:
            pass
        # 禁用非重复闹钟
        alarm['enabled'] = False
"
        fi
        sleep 30
    done
}
# 主菜单
main() {
    echo "=" * 50
    echo "⏰ 闹钟管理脚本"
    echo "=" * 50
    while true; do
        echo ""
        echo "📌 命令菜单:"
        echo "1. 添加闹钟"
        echo "2. 查看闹钟"
        echo "3. 删除闹钟"
        echo "4. 启动监控"
        echo "5. 退出"
        read -p "请输入选择 (1-5): " choice
        case $choice in
            1)
                read -p "请输入时间 (HH:MM): " time
                read -p "请输入提醒信息: " message
                add_alarm "$time" "$message"
                ;;
            2)
                list_alarms
                ;;
            3)
                list_alarms
                read -p "请输入要删除的闹钟编号: " id
                delete_alarm $id
                ;;
            4)
                monitor_alarms
                ;;
            5)
                echo "👋 再见!"
                exit 0
                ;;
            *)
                echo "❌ 无效选择"
                ;;
        esac
    done
}
# 运行主函数
main

使用方法

Python版本:

# 保存为 alarm.py
chmod +x alarm.py
./alarm.py

Shell版本:

# 保存为 alarm.sh
chmod +x alarm.sh
./alarm.sh

功能特点

  1. 添加闹钟:支持指定时间、消息、是否重复
  2. 查看闹钟:显示所有闹钟状态
  3. 删除闹钟:按ID删除
  4. 启用/禁用:临时开关闹钟
  5. 声音提醒:自动播放声音
  6. 持久化存储:闹钟数据保存在JSON文件中

这个脚本可以根据你的需求进一步定制,比如添加更多闹钟类型、美化界面等。

抱歉,评论功能暂时关闭!