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

Как написать простой будильник на Python

5 min read Python Обновлено 09 Jan 2026
Как сделать будильник на Python
Как сделать будильник на Python

Будильник на столе

Будильник — простое упражнение для практики Python. Скрипт можно хранить в одном файле и запускать из терминала. Программа запрашивает у пользователя время в формате “час:минута”, рассчитывает, сколько секунд нужно ждать, и затем выводит сообщение о срабатывании (или делает обратный отсчёт).

Что вы получите из этой статьи

  • Готовый пример скрипта на Python с валидацией ввода.
  • Как вычислять задержку в секундах и учитывать переход на следующий день.
  • Вариант с почасовым/поминутным обратным отсчётом.
  • Чек-лист запуска и критерии приёмки.

Важно: этот учебный пример рассчитан на локальный запуск в консоли. Для фонового сервиса, графического интерфейса или уведомлений используйте соответствующие библиотеки (sched, apscheduler, GUI-фреймворки, системные уведомления).

1. Создайте файл скрипта

  1. Создайте новый файл с именем alarm.py.
  2. Откройте его в любом текстовом редакторе (Notepad++, VS Code, Sublime и т. п.).
  3. В начале импортируйте необходимые модули: datetime и time.
import datetime
import time

2. Пример рабочего скрипта с валидацией ввода

Ниже — компактный, понятный пример консольного будильника. Комментарии объясняют логику шаг за шагом.

import datetime
import time

# Функция для получения корректного времени от пользователя в формате H:M
def get_alarm_time():
    invalid = True
    while invalid:
        # Запрос времени у пользователя
        print("Установите время для будильника (пример: 06:30)")
        userInput = input(">> ")

        try:
            # Разделяем строку и преобразуем в числа
            alarmTime = [int(n) for n in userInput.split(":")]

            # Проверяем, что получили ровно два числа: часы и минуты
            if len(alarmTime) != 2:
                print("Нужно ввести два числа: часы и минуты через двоеточие.")
                invalid = True
                continue

            # Проверяем диапазоны: 0-23 для часов, 0-59 для минут
            if alarmTime[0] >= 24 or alarmTime[0] < 0:
                print("Час должен быть от 0 до 23.")
                invalid = True
            elif alarmTime[1] >= 60 or alarmTime[1] < 0:
                print("Минута должна быть от 0 до 59.")
                invalid = True
            else:
                invalid = False
                return alarmTime

        except ValueError:
            print("Неверный формат. Используйте цифры и двоеточие, например 7:05.")
            invalid = True


def seconds_until_alarm(alarmTime):
    # Количество секунд в часе, минуте и секунде
    seconds_hms = [3600, 60, 1]

    # Конвертируем время будильника в секунды с начала дня
    alarmSeconds = sum([a * b for a, b in zip(seconds_hms[:len(alarmTime)], alarmTime)])

    now = datetime.datetime.now()
    # Текущее время в секундах с начала дня
    currentTimeInSeconds = sum([a * b for a, b in zip(seconds_hms, [now.hour, now.minute, now.second])])

    secondsUntilAlarm = alarmSeconds - currentTimeInSeconds

    # Если время уже прошло сегодня — переносим на следующий день
    if secondsUntilAlarm < 0:
        secondsUntilAlarm += 86400  # число секунд в сутках

    return secondsUntilAlarm


def run_alarm(countdown=True):
    alarmTime = get_alarm_time()
    secondsUntilAlarm = seconds_until_alarm(alarmTime)

    print("Будильник установлен!")
    print("Осталось: %s" % datetime.timedelta(seconds=secondsUntilAlarm))

    if countdown:
        # Обратный отсчёт по секундам
        for i in range(0, secondsUntilAlarm):
            time.sleep(1)
            secondsUntilAlarm -= 1
            print(datetime.timedelta(seconds=secondsUntilAlarm))
    else:
        # Тихая пауза до срабатывания
        time.sleep(secondsUntilAlarm)

    print("Звонок! Пора вставать!")


if __name__ == '__main__':
    run_alarm(countdown=True)

3. Объяснение ключевых шагов

  • get_alarm_time(): цикл while гарантирует, что пользователь введёт корректное значение. Если ввод неверен — повторяем.
  • Преобразование в секунды: часы×3600 + минуты×60. Это упрощает сравнение с текущим временем.
  • Корректировка для следующего дня: если рассчитанная разница отрицательна, прибавляем 86400 секунд.
  • time.sleep(n): приостанавливает выполнение на n секунд; при длительных задержках это блокирует основной поток.

4. Варианты поведения будильника

  • Без обратного отсчёта: уберите цикл и используйте только time.sleep(secondsUntilAlarm) — экономичнее, но пользователь не видит прогресса.
  • С обратным отсчётом: полезно для наглядности; но при очень длинных интервалах в консоли будут тысячи строк.
  • Несколько сигналов/повтор: можно поместить функцию в цикл и повторять с интервалом snooze.
  • Фоновый сервис: для непрерывной работы используйте планировщики (cron, systemd timers, apscheduler).

5. Как запустить скрипт

  1. Откройте терминал/командную строку и перейдите в папку с alarm.py. Например, если файл на рабочем столе:
cd Desktop

(Примечание: в русской локали Windows папка «Рабочий стол» называется “Рабочий стол”; используйте соответствующий путь.)

  1. Запустите скрипт командой:
python alarm.py
  1. Введите время в формате час:минута (например, 4:30).

Установка будильника в консоли

  1. Скрипт начнёт обратный отсчёт (если включён) и по завершении выведет сообщение о срабатывании.

Обратный отсчёт до будильника

  1. В конце вы увидите уведомление о срабатывании:

Будильник с сообщением

Когда этот подход не подходит

  • Для постоянного фонового будильника в серверной среде: блокировка потока через time.sleep нежелательна. Лучше использовать планировщик задач.
  • Для звукового сигнала или системных уведомлений: потребуется сторонняя библиотека (playsound, plyer) или интеграция с API ОС.
  • Для мобильных приложений или веба: этот код не применим — нужен соответствующий стек (Android/iOS, веб-frontend).

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

  • sched или apscheduler: планирование задач без блокировки основного потока.
  • asyncio + loop.call_later: неблокирующий вариант с асинхронностью.
  • Использовать CRON (Linux) / Task Scheduler (Windows) для запуска скрипта в нужное время.

Мини-методология: как превратить этот MVP в полезное приложение

  1. Решите, нужен ли фон/GUI/уведомления со звуком.
  2. Если нужен звук — подключите библиотеку для воспроизведения.
  3. Для надежности в фоне — используйте системные планировщики или демоны.
  4. Добавьте логирование и обработку ошибок.
  5. Напишите тесты на парсинг времени и вычисления секунд.

Чек-лист перед запуском

  • Файл alarm.py существует и открыт в редакторе.
  • Установлен Python (проверить python –version).
  • В коде верно настроены timezone и локаль (при необходимости).
  • Протестирован ввод: 00:01, 23:59, 7:00.
  • Проверено поведение при неверном вводе (буквы, пропущенное двоеточие).

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

  • Скрипт корректно принимает ввод в формате H:M.
  • Скрипт выводит корректное оставшееся время до сигнала.
  • При установке времени в прошлом скрипт ждёт до следующего дня.
  • Если включён обратный отсчёт — количество оставшихся секунд уменьшается каждую секунду.

Факт-бокс: ключевые числа

  • 1 час = 3600 секунд
  • 1 минута = 60 секунд
  • 1 сутки = 86400 секунд

Глоссарий (1 строка each)

  • time.sleep — приостанавливает выполнение потока на указанное число секунд.
  • datetime.datetime.now() — получает текущее локальное время с точностью до секунд.

Советы по локализации и тонкостям

  • Формат времени: в примере используется 24-часовой формат (0–23). Можно адаптировать под 12-часовой с AM/PM при необходимости.
  • Папки в ОС: в командах примера используется “Desktop” — в локализованных системах имя папки может отличаться.
  • Для отображения времени используйте datetime.timedelta для человекочитаемого формата.

Безопасность и надёжность

  • Этот скрипт безопасен в локальной среде. Не храните в нём учётные данные.
  • Для длительного выполнения на сервере используйте надежные механизмы менеджмента процессов.

Заключение

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

Краткое повторение: валидируйте ввод, учитывайте переход на следующий день (+86400 с), используйте time.sleep для простой реализации и планировщики/асинхронность для более надёжных решений.

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

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

Градиенты в Canva: добавить и настроить
Дизайн

Градиенты в Canva: добавить и настроить

Ошибка Disabled accounts can't be contacted в Instagram
Социальные сети

Ошибка Disabled accounts can't be contacted в Instagram

Генерация случайных чисел в Google Sheets
Google Таблицы

Генерация случайных чисел в Google Sheets

Прокручиваемые скриншоты в Windows 11
Windows

Прокручиваемые скриншоты в Windows 11

Как установить корпусной вентилятор в ПК
Железо

Как установить корпусной вентилятор в ПК

Check In в iOS 17: настройка и безопасность
How-to

Check In в iOS 17: настройка и безопасность