Гид по технологиям

Простой будильник на Python: пошаговое руководство

4 min read Python Обновлено 21 Dec 2025
Будильник на Python — простой скрипт
Будильник на Python — простой скрипт

Настольный будильник на столе

Зачем это упражнение

Это практическое упражнение помогает освоить работу с модулем datetime, цикл while, обработку ошибок и задержки выполнения (time.sleep). Короткий проект — полезный способ закріпить базовые навыки Python.

Important: В примерах используется 24-часовой формат времени (от 00:00 до 23:59).

Что вы получите в результате

  • Однофайловый скрипт alarm.py, который устанавливает будильник по времени ЧЧ:ММ.
  • Опциональный покадровый отсчёт в консоли.
  • Обработка неверного ввода и перехода на следующий день.

Полный пример скрипта alarm.py

Ниже — окончательный, понятный и безопасный пример скрипта. Скопируйте его в файл alarm.py и запустите через python alarm.py.

import datetime
import time
import sys

SECONDS_IN_DAY = 24 * 3600

def parse_time(user_input: str):
    """Парсит строку ЧЧ:ММ и возвращает [час, минута] или вызывает ValueError."""
    parts = user_input.strip().split(":")
    if len(parts) != 2:
        raise ValueError("Неверный формат. Ожидается ЧЧ:ММ")
    hour, minute = int(parts[0]), int(parts[1])
    if not (0 <= hour <= 23 and 0 <= minute <= 59):
        raise ValueError("Часы 0-23, минуты 0-59")
    return [hour, minute]

def time_to_seconds(hm):
    """Конвертирует [час, минута] в секунды от начала дня."""
    return hm[0] * 3600 + hm[1] * 60

def seconds_until(alarm_seconds, now_seconds):
    """Вычисляет, сколько секунд ждать; если время прошло — добавляет сутки."""
    diff = alarm_seconds - now_seconds
    if diff < 0:
        diff += SECONDS_IN_DAY
    return diff

def human_delta(seconds):
    """Возвращает datetime.timedelta-строку для удобного вывода."""
    return str(datetime.timedelta(seconds=seconds))

def main():
    print("Установите время будильника в формате ЧЧ:ММ (24-часовой формат)")

    while True:
        try:
            user_input = input(">> ")
            alarm_hm = parse_time(user_input)
            break
        except ValueError as e:
            print("Ошибка:", e)
            print("Попробуйте ещё раз. Пример: 06:30")
        except (KeyboardInterrupt, EOFError):
            print("\nВыход.")
            sys.exit(0)

    seconds_hms = [3600, 60, 1]
    alarm_seconds = time_to_seconds(alarm_hm)

    now = datetime.datetime.now()
    current_seconds = now.hour * 3600 + now.minute * 60 + now.second

    wait_seconds = seconds_until(alarm_seconds, current_seconds)

    print("Будильник установлен!")
    print("Сигнал прозвонит через:", human_delta(wait_seconds))
    print("Текущее время:", now.time().replace(microsecond=0))
    print("Будильник на:", f"{alarm_hm[0]:02d}:{alarm_hm[1]:02d}")

    # Выберите режим: простой сон или отсчёт. Комментарии показывают, как переключать.
    try:
        # Простой режим: просто спать нужное количество секунд
        # time.sleep(wait_seconds)

        # Режим с отсчётом по секундам:
        for i in range(wait_seconds, 0, -1):
            print(human_delta(i), end="\r")
            time.sleep(1)

        # Сигнал — выводим сообщение и звуковой сигнал (если терминал его поддерживает)
        print("\nRing Ring... пора просыпаться!")
        print('\a')  # ASCII BEL — может издать короткий звук в терминале
    except KeyboardInterrupt:
        print("\nБудильник отменён пользователем.")
        sys.exit(0)

if __name__ == "__main__":
    main()

Notes: Этот скрипт работает в стандартной консоли. Звуковой сигнал через ‘\a’ зависит от поддержки терминала и ОС.

Пошаговое объяснение ключевых частей

  • Ввод и валидация: parse_time проверяет формат и диапазон часов/минут. Это предотвращает падение программы.
  • Перевод времени в секунды: удобно представлять время как количество секунд от полуночи. Тогда вычитание даёт разницу в секундах.
  • Обработка следующего дня: если рассчитанная разница отрицательна, прибавляем 24 часа (86400 секунд).
  • Отсчёт: цикл for иллюстрирует покадровый вывод оставшегося времени. Для большого интервала можно обновлять каждые N секунд.

Когда такой подход не подходит (примеры и ограничения)

  • Если нужен будильник с точностью под миллисекунды или для многопоточности — используйте планировщик задач (sched, APScheduler) или службу операционной системы.
  • Если приложение должно работать в фоне после закрытия терминала — потребуется демон / служба (systemd, Windows Service) или контейнер.
  • Для уведомлений или звука кроссплатформенно лучше использовать внешние библиотеки (playsound, pyglet) или системные нотификации.

Альтернативные подходы

  • Использовать модуль sched для планирования задач внутри процесса.
  • Подключать cron/Task Scheduler для регулярных задач вместо постоянно работающего процесса.
  • Запускать скрипт как фоновую службу (systemd на Linux).

Быстрое умозаключение (ментальная модель)

Представляйте момент времени как позицию на оси длиной 86400 (секунд). Разность позиций между «сейчас» и «цель» — время ожидания. Если цель левее текущего — означет переход на следующий круг (добавляем длину круга).

Критерии приёмки

  • Ввод принимает только строки формата ЧЧ:ММ.
  • Будильник правильно рассчитывает время ожидания, включая переход на следующий день.
  • Программа не падает при неверном вводе; предлагает повторить.
  • Пользователь может прервать будильник сочетанием Ctrl+C.

Тесты и сценарии приёмки

  • Тест 1: Ввод 00:01 в 23:59 => ожидание ~00:02 (1 минута + переход на сутки).
  • Тест 2: Ввод текущего времени => должно сработать через ~0 секунд (в пределах секунды).
  • Тест 3: Ввод 24:00 или 12:60 => ошибка валидации и повтор ввода.
  • Тест 4: Прерывание Ctrl+C во время отсчёта => программа должна корректно выйти.

Чеклист для ученика и преподавателя

  • Ученик:

    • Скопировал скрипт в alarm.py
    • Запустил python alarm.py и установил время
    • Проверил отсчёт и появление сообщения
    • Попробовал некорректный ввод и Ctrl+C
  • Преподаватель:

    • Проверил обработку ошибок
    • Убедился, что переход на следующий день работает
    • Проверил поведение на разных ОС (по возможности)

Советы по улучшению и расширению

  • Добавьте аргументы командной строки (argparse) для установки времени без интерактивного ввода.
  • Подключите playsound или другое аудио для воспроизведения мелодии.
  • Реализуйте повторяющийся будильник (ежедневно/по расписанию) с помощью APScheduler.
  • Сохраняйте настройки в JSON, чтобы будильник запускался автоматически после рестарта приложения.

Отладка и распространённые ошибки

  • Ошибка ValueError при int(): значит, ввод содержит нечисловые символы. Решение: сообщить пользователю и предложить пример.
  • Звук не слышен: терминал или ОС может игнорировать BEL (\a). Используйте библиотеку для воспроизведения аудио.
  • Скрипт “засыпает” и не отвечает: это ожидаемое поведение при time.sleep. Для интерактивности используйте потоки или планировщик.

Примеры использования и демонстрация в терминале

  1. Запустите:
python alarm.py
  1. Введите время: 06:30
  2. Увидите сообщение: “Будильник установлен!” и отсчёт.
  3. После завершения отсчёта: “Ring Ring… пора просыпаться!”

Установка будильника в Python во время выполнения

Будильник Python с отсчётом до установленного времени

Будильник Python во время срабатывания с сообщениями Wake Up

Короткая методология (микро-SOP)

  1. Создайте alarm.py.
  2. Импортируйте datetime и time.
  3. Запросите у пользователя ЧЧ:ММ и провалидируйте.
  4. Переведите цель и текущее время в секунды.
  5. Вычислите разницу, учитывая переход на следующий день.
  6. Подождите (time.sleep или цикл) и выведите уведомление.

Краткий словарь терминов

  • time.sleep: функция, приостанавливающая выполнение на N секунд.
  • datetime.now(): возвращает текущую дату и время.
  • Секунды от начала дня: удобное целочисленное представление времени.

Итог

Создание простого будильника на Python — хорошее упражнение для закрепления работы с временем и потоками выполнения. Начните с интерактивной версии, затем расширяйте функционал: аргументы командной строки, звуковые уведомления и планирование задач.

Summary: Это упражнение помогает освоить ввод и валидацию, работу с datetime и задержками. Скрипт можно улучшать и интегрировать в более сложные проекты.

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Как подать налоги онлайн через TurboTax — подробный гид
Налоги

Как подать налоги онлайн через TurboTax — подробный гид

Input lag и падения FPS — разница и как устранить
Гейминг

Input lag и падения FPS — разница и как устранить

Сброс Apple TV к заводским настройкам
Руководство

Сброс Apple TV к заводским настройкам

Как зарегистрироваться и начать пользоваться Claude AI
Искусственный интеллект

Как зарегистрироваться и начать пользоваться Claude AI

Просмотр трофеев в приложении PlayStation
Игры

Просмотр трофеев в приложении PlayStation

Как создать запоминающийся логотип — практическое руководство
Дизайн

Как создать запоминающийся логотип — практическое руководство