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

Будильник — простое упражнение для практики Python. Скрипт можно хранить в одном файле и запускать из терминала. Программа запрашивает у пользователя время в формате “час:минута”, рассчитывает, сколько секунд нужно ждать, и затем выводит сообщение о срабатывании (или делает обратный отсчёт).
Что вы получите из этой статьи
- Готовый пример скрипта на Python с валидацией ввода.
- Как вычислять задержку в секундах и учитывать переход на следующий день.
- Вариант с почасовым/поминутным обратным отсчётом.
- Чек-лист запуска и критерии приёмки.
Важно: этот учебный пример рассчитан на локальный запуск в консоли. Для фонового сервиса, графического интерфейса или уведомлений используйте соответствующие библиотеки (sched, apscheduler, GUI-фреймворки, системные уведомления).
1. Создайте файл скрипта
- Создайте новый файл с именем alarm.py.
- Откройте его в любом текстовом редакторе (Notepad++, VS Code, Sublime и т. п.).
- В начале импортируйте необходимые модули: datetime и time.
import datetime
import time2. Пример рабочего скрипта с валидацией ввода
Ниже — компактный, понятный пример консольного будильника. Комментарии объясняют логику шаг за шагом.
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. Как запустить скрипт
- Откройте терминал/командную строку и перейдите в папку с alarm.py. Например, если файл на рабочем столе:
cd Desktop(Примечание: в русской локали Windows папка «Рабочий стол» называется “Рабочий стол”; используйте соответствующий путь.)
- Запустите скрипт командой:
python alarm.py- Введите время в формате час:минута (например, 4:30).

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

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

Когда этот подход не подходит
- Для постоянного фонового будильника в серверной среде: блокировка потока через time.sleep нежелательна. Лучше использовать планировщик задач.
- Для звукового сигнала или системных уведомлений: потребуется сторонняя библиотека (playsound, plyer) или интеграция с API ОС.
- Для мобильных приложений или веба: этот код не применим — нужен соответствующий стек (Android/iOS, веб-frontend).
Альтернативные подходы
- sched или apscheduler: планирование задач без блокировки основного потока.
- asyncio + loop.call_later: неблокирующий вариант с асинхронностью.
- Использовать CRON (Linux) / Task Scheduler (Windows) для запуска скрипта в нужное время.
Мини-методология: как превратить этот MVP в полезное приложение
- Решите, нужен ли фон/GUI/уведомления со звуком.
- Если нужен звук — подключите библиотеку для воспроизведения.
- Для надежности в фоне — используйте системные планировщики или демоны.
- Добавьте логирование и обработку ошибок.
- Напишите тесты на парсинг времени и вычисления секунд.
Чек-лист перед запуском
- Файл 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 для простой реализации и планировщики/асинхронность для более надёжных решений.
Похожие материалы
Градиенты в Canva: добавить и настроить
Ошибка Disabled accounts can't be contacted в Instagram
Генерация случайных чисел в Google Sheets
Прокручиваемые скриншоты в Windows 11
Как установить корпусной вентилятор в ПК