Найти в Дзене
IT Start | Python

Таймер обратного отсчёта до Нового Года на Python

В этой статье мы напишем код таймера обратного отсчёта до Нового Года на Python с графическим интерфейсом. Для написания кода нам понадобятся стандартные модули Python: tkinter для интерфейса и datetime для расчёта времени до Нового года. Импортируем tkinter и метод datetime из datetime: import tkinter as tk
from datetime import datetime Создадим главное окно приложения, а также зададим заголовок и цвет фона: import tkinter as tk
from datetime import datetime # Создаём главное окно
root = tk.Tk()
# Добавляем заголовок окна
root.title("🎄 До Нового Года осталось:")
# Указываем цвет фона
root.configure(bg='#0a2e36') Далее определим шрифты, которые будут использоваться для числовых значений и текстовых подписей: import tkinter as tk
from datetime import datetime root = tk.Tk()
root.title("🎄 До Нового Года осталось:")
root.configure(bg='#0a2e36') font_large = ("Courier", 48, "bold")
font_small = ("Arial", 14) Для удобного размещения элементов воспользуемся контейнером Frame, вн
Оглавление

Введение

В этой статье мы напишем код таймера обратного отсчёта до Нового Года на Python с графическим интерфейсом.

Написание кода новогоднего таймера на Python

Импорт библиотек

Для написания кода нам понадобятся стандартные модули Python: tkinter для интерфейса и datetime для расчёта времени до Нового года. Импортируем tkinter и метод datetime из datetime:

import tkinter as tk
from datetime import datetime

Создание главного окна

Создадим главное окно приложения, а также зададим заголовок и цвет фона:

import tkinter as tk
from datetime import datetime

# Создаём главное окно
root = tk.Tk()
# Добавляем заголовок окна
root.title("🎄 До Нового Года осталось:")
# Указываем цвет фона
root.configure(bg='#0a2e36')

Далее определим шрифты, которые будут использоваться для числовых значений и текстовых подписей:

import tkinter as tk
from datetime import datetime

root = tk.Tk()
root.title("🎄 До Нового Года осталось:")
root.configure(bg='#0a2e36')

font_large = ("Courier", 48, "bold")
font_small = ("Arial", 14)

Для удобного размещения элементов воспользуемся контейнером Frame, внутри которого будут располагаться все виджеты:

import tkinter as tk
from datetime import datetime

root = tk.Tk()
root.title("🎄 До Нового Года осталось:")
root.configure(bg='#0a2e36')

font_large = ("Courier", 48, "bold")
font_small = ("Arial", 14)

frame = tk.Frame(root, bg='#0a2e36')
frame.pack(expand=True)

Теперь создадим текстовые подписи, поясняющие, какие единицы времени отображаются в таймере:

import tkinter as tk
from datetime import datetime

root = tk.Tk()
root.title("🎄 До Нового Года осталось:")
root.configure(bg='#0a2e36')

font_large = ("Courier", 48, "bold")
font_small = ("Arial", 14)

frame = tk.Frame(root, bg='#0a2e36')
frame.pack(expand=True)

tk.Label(frame, text="ДНЕЙ", font=font_small, bg='#0a2e36', fg='white').grid(row=0, column=0, padx=10)
tk.Label(frame, text="ЧАСОВ", font=font_small, bg='#0a2e36', fg='white').grid(row=0, column=1, padx=10)
tk.Label(frame, text="МИНУТ", font=font_small, bg='#0a2e36', fg='white').grid(row=0, column=2, padx=10)
tk.Label(frame, text="СЕКУНД", font=font_small, bg='#0a2e36', fg='white').grid(row=0, column=3, padx=10)

Также создадим элементы, отвечающие за отображение текущих числовых значений обратного отсчёта:

import tkinter as tk
from datetime import datetime

root = tk.Tk()
root.title("🎄 До Нового Года осталось:")
root.configure(bg='#0a2e36')

font_large = ("Courier", 48, "bold")
font_small = ("Arial", 14)

frame = tk.Frame(root, bg='#0a2e36')
frame.pack(expand=True)

tk.Label(frame, text="ДНЕЙ", font=font_small, bg='#0a2e36', fg='white').grid(row=0, column=0, padx=10)
tk.Label(frame, text="ЧАСОВ", font=font_small, bg='#0a2e36', fg='white').grid(row=0, column=1, padx=10)
tk.Label(frame, text="МИНУТ", font=font_small, bg='#0a2e36', fg='white').grid(row=0, column=2, padx=10)
tk.Label(frame, text="СЕКУНД", font=font_small, bg='#0a2e36', fg='white').grid(row=0, column=3, padx=10)

label_days = tk.Label(frame, text="00", font=font_large, bg='#1a4a5a', fg='#4afc9f', width=3)
label_hours = tk.Label(frame, text="00", font=font_large, bg='#1a4a5a', fg='#4afc9f', width=3)
label_minutes = tk.Label(frame, text="00", font=font_large, bg='#1a4a5a', fg='#4afc9f', width=3)
label_seconds = tk.Label(frame, text="00", font=font_large, bg='#1a4a5a', fg='#4afc9f', width=3)

Для удобного выравнивания элементов воспользуемся гридами:

import tkinter as tk
from datetime import datetime

root = tk.Tk()
root.title("🎄 До Нового Года осталось:")
root.configure(bg='#0a2e36')

font_large = ("Courier", 48, "bold")
font_small = ("Arial", 14)

frame = tk.Frame(root, bg='#0a2e36')
frame.pack(expand=True)

tk.Label(frame, text="ДНЕЙ", font=font_small, bg='#0a2e36', fg='white').grid(row=0, column=0, padx=10)
tk.Label(frame, text="ЧАСОВ", font=font_small, bg='#0a2e36', fg='white').grid(row=0, column=1, padx=10)
tk.Label(frame, text="МИНУТ", font=font_small, bg='#0a2e36', fg='white').grid(row=0, column=2, padx=10)
tk.Label(frame, text="СЕКУНД", font=font_small, bg='#0a2e36', fg='white').grid(row=0, column=3, padx=10)

label_days = tk.Label(frame, text="00", font=font_large, bg='#1a4a5a', fg='#4afc9f', width=3)
label_hours = tk.Label(frame, text="00", font=font_large, bg='#1a4a5a', fg='#4afc9f', width=3)
label_minutes = tk.Label(frame, text="00", font=font_large, bg='#1a4a5a', fg='#4afc9f', width=3)
label_seconds = tk.Label(frame, text="00", font=font_large, bg='#1a4a5a', fg='#4afc9f', width=3)

label_days.grid(row=1, column=0, padx=10, pady=10)
label_hours.grid(row=1, column=1, padx=10, pady=10)
label_minutes.grid(row=1, column=2, padx=10, pady=10)
label_seconds.grid(row=1, column=3, padx=10, pady=10)

В конце добавим запуск функции обратного отсчёта и основной цикл обработки событий tkinter:

import tkinter as tk
from datetime import datetime

root = tk.Tk()
root.title("🎄 До Нового Года осталось:")
root.configure(bg='#0a2e36')

font_large = ("Courier", 48, "bold")
font_small = ("Arial", 14)

frame = tk.Frame(root, bg='#0a2e36')
frame.pack(expand=True)

tk.Label(frame, text="ДНЕЙ", font=font_small, bg='#0a2e36', fg='white').grid(row=0, column=0, padx=10)
tk.Label(frame, text="ЧАСОВ", font=font_small, bg='#0a2e36', fg='white').grid(row=0, column=1, padx=10)
tk.Label(frame, text="МИНУТ", font=font_small, bg='#0a2e36', fg='white').grid(row=0, column=2, padx=10)
tk.Label(frame, text="СЕКУНД", font=font_small, bg='#0a2e36', fg='white').grid(row=0, column=3, padx=10)

label_days = tk.Label(frame, text="00", font=font_large, bg='#1a4a5a', fg='#4afc9f', width=3)
label_hours = tk.Label(frame, text="00", font=font_large, bg='#1a4a5a', fg='#4afc9f', width=3)
label_minutes = tk.Label(frame, text="00", font=font_large, bg='#1a4a5a', fg='#4afc9f', width=3)
label_seconds = tk.Label(frame, text="00", font=font_large, bg='#1a4a5a', fg='#4afc9f', width=3)

label_days.grid(row=1, column=0, padx=10, pady=10)
label_hours.grid(row=1, column=1, padx=10, pady=10)
label_minutes.grid(row=1, column=2, padx=10, pady=10)
label_seconds.grid(row=1, column=3, padx=10, pady=10)

update_countdown()
root.mainloop()

Функция обновления таймера

Теперь создадим функцию update_countdown(), которая будет выполнять основную логику программы: вычислять, сколько времени осталось до Нового года, и обновлять данные в интерфейсе каждую секунду. Внутри неё, первым делом мы будем получать текущее время и создавать дату следующего Нового года:

import tkinter as tk
from datetime import datetime

def update_countdown():
now = datetime.now()
new_year = datetime(now.year + 1, 1, 1, 0, 0, 0)

root = tk.Tk()
root.title("🎄 До Нового Года осталось:")
root.configure(bg='#0a2e36')

font_large = ("Courier", 48, "bold")
font_small = ("Arial", 14)

frame = tk.Frame(root, bg='#0a2e36')
frame.pack(expand=True)

tk.Label(frame, text="ДНЕЙ", font=font_small, bg='#0a2e36', fg='white').grid(row=0, column=0, padx=10)
tk.Label(frame, text="ЧАСОВ", font=font_small, bg='#0a2e36', fg='white').grid(row=0, column=1, padx=10)
tk.Label(frame, text="МИНУТ", font=font_small, bg='#0a2e36', fg='white').grid(row=0, column=2, padx=10)
tk.Label(frame, text="СЕКУНД", font=font_small, bg='#0a2e36', fg='white').grid(row=0, column=3, padx=10)

label_days = tk.Label(frame, text="00", font=font_large, bg='#1a4a5a', fg='#4afc9f', width=3)
label_hours = tk.Label(frame, text="00", font=font_large, bg='#1a4a5a', fg='#4afc9f', width=3)
label_minutes = tk.Label(frame, text="00", font=font_large, bg='#1a4a5a', fg='#4afc9f', width=3)
label_seconds = tk.Label(frame, text="00", font=font_large, bg='#1a4a5a', fg='#4afc9f', width=3)

label_days.grid(row=1, column=0, padx=10, pady=10)
label_hours.grid(row=1, column=1, padx=10, pady=10)
label_minutes.grid(row=1, column=2, padx=10, pady=10)
label_seconds.grid(row=1, column=3, padx=10, pady=10)

update_countdown()
root.mainloop()

Далее добавим проверку, что если программа запущена уже после Нового года, то дата пересчитывается, чтобы таймер работал корректно:

import tkinter as tk
from datetime import datetime

def update_countdown():
now = datetime.now()
new_year = datetime(now.year + 1, 1, 1, 0, 0, 0)

if now > new_year:
new_year = datetime(now.year, 1, 1, 0, 0, 0)

root = tk.Tk()
root.title("🎄 До Нового Года осталось:")
root.configure(bg='#0a2e36')

font_large = ("Courier", 48, "bold")
font_small = ("Arial", 14)

frame = tk.Frame(root, bg='#0a2e36')
frame.pack(expand=True)

tk.Label(frame, text="ДНЕЙ", font=font_small, bg='#0a2e36', fg='white').grid(row=0, column=0, padx=10)
tk.Label(frame, text="ЧАСОВ", font=font_small, bg='#0a2e36', fg='white').grid(row=0, column=1, padx=10)
tk.Label(frame, text="МИНУТ", font=font_small, bg='#0a2e36', fg='white').grid(row=0, column=2, padx=10)
tk.Label(frame, text="СЕКУНД", font=font_small, bg='#0a2e36', fg='white').grid(row=0, column=3, padx=10)

label_days = tk.Label(frame, text="00", font=font_large, bg='#1a4a5a', fg='#4afc9f', width=3)
label_hours = tk.Label(frame, text="00", font=font_large, bg='#1a4a5a', fg='#4afc9f', width=3)
label_minutes = tk.Label(frame, text="00", font=font_large, bg='#1a4a5a', fg='#4afc9f', width=3)
label_seconds = tk.Label(frame, text="00", font=font_large, bg='#1a4a5a', fg='#4afc9f', width=3)

label_days.grid(row=1, column=0, padx=10, pady=10)
label_hours.grid(row=1, column=1, padx=10, pady=10)
label_minutes.grid(row=1, column=2, padx=10, pady=10)
label_seconds.grid(row=1, column=3, padx=10, pady=10)

update_countdown()
root.mainloop()

Добавим расчёт оставшегося времени до Нового Года. Разницу между текущей датой и датой Нового года возвращает объект timedelta. Из него мы поэтапно извлекаем дни, часы, минуты и секунды:

import tkinter as tk
from datetime import datetime

def update_countdown():
now = datetime.now()
new_year = datetime(now.year + 1, 1, 1, 0, 0, 0)

if now > new_year:
new_year = datetime(now.year, 1, 1, 0, 0, 0)

time_left = new_year - now

days = time_left.days
hours, remainder = divmod(time_left.seconds, 3600)
minutes, seconds = divmod(remainder, 60)

root = tk.Tk()
root.title("🎄 До Нового Года осталось:")
root.configure(bg='#0a2e36')

font_large = ("Courier", 48, "bold")
font_small = ("Arial", 14)

frame = tk.Frame(root, bg='#0a2e36')
frame.pack(expand=True)

tk.Label(frame, text="ДНЕЙ", font=font_small, bg='#0a2e36', fg='white').grid(row=0, column=0, padx=10)
tk.Label(frame, text="ЧАСОВ", font=font_small, bg='#0a2e36', fg='white').grid(row=0, column=1, padx=10)
tk.Label(frame, text="МИНУТ", font=font_small, bg='#0a2e36', fg='white').grid(row=0, column=2, padx=10)
tk.Label(frame, text="СЕКУНД", font=font_small, bg='#0a2e36', fg='white').grid(row=0, column=3, padx=10)

label_days = tk.Label(frame, text="00", font=font_large, bg='#1a4a5a', fg='#4afc9f', width=3)
label_hours = tk.Label(frame, text="00", font=font_large, bg='#1a4a5a', fg='#4afc9f', width=3)
label_minutes = tk.Label(frame, text="00", font=font_large, bg='#1a4a5a', fg='#4afc9f', width=3)
label_seconds = tk.Label(frame, text="00", font=font_large, bg='#1a4a5a', fg='#4afc9f', width=3)

label_days.grid(row=1, column=0, padx=10, pady=10)
label_hours.grid(row=1, column=1, padx=10, pady=10)
label_minutes.grid(row=1, column=2, padx=10, pady=10)
label_seconds.grid(row=1, column=3, padx=10, pady=10)

update_countdown()
root.mainloop()

После расчёта значения будут подставляться в соответствующие элементы интерфейса и сразу отображаются на экране. Элементы интерфейса или же графические лейблы создадим чуть позже.

import tkinter as tk
from datetime import datetime

def update_countdown():
now = datetime.now()
new_year = datetime(now.year + 1, 1, 1, 0, 0, 0)

if now > new_year:
new_year = datetime(now.year, 1, 1, 0, 0, 0)

time_left = new_year - now

days = time_left.days
hours, remainder = divmod(time_left.seconds, 3600)
minutes, seconds = divmod(remainder, 60)

label_days.config(text=f"{days:02d}")
label_hours.config(text=f"{hours:02d}")
label_minutes.config(text=f"{minutes:02d}")
label_seconds.config(text=f"{seconds:02d}")

root = tk.Tk()
root.title("🎄 До Нового Года осталось:")
root.configure(bg='#0a2e36')

font_large = ("Courier", 48, "bold")
font_small = ("Arial", 14)

frame = tk.Frame(root, bg='#0a2e36')
frame.pack(expand=True)

tk.Label(frame, text="ДНЕЙ", font=font_small, bg='#0a2e36', fg='white').grid(row=0, column=0, padx=10)
tk.Label(frame, text="ЧАСОВ", font=font_small, bg='#0a2e36', fg='white').grid(row=0, column=1, padx=10)
tk.Label(frame, text="МИНУТ", font=font_small, bg='#0a2e36', fg='white').grid(row=0, column=2, padx=10)
tk.Label(frame, text="СЕКУНД", font=font_small, bg='#0a2e36', fg='white').grid(row=0, column=3, padx=10)

label_days = tk.Label(frame, text="00", font=font_large, bg='#1a4a5a', fg='#4afc9f', width=3)
label_hours = tk.Label(frame, text="00", font=font_large, bg='#1a4a5a', fg='#4afc9f', width=3)
label_minutes = tk.Label(frame, text="00", font=font_large, bg='#1a4a5a', fg='#4afc9f', width=3)
label_seconds = tk.Label(frame, text="00", font=font_large, bg='#1a4a5a', fg='#4afc9f', width=3)

label_days.grid(row=1, column=0, padx=10, pady=10)
label_hours.grid(row=1, column=1, padx=10, pady=10)
label_minutes.grid(row=1, column=2, padx=10, pady=10)
label_seconds.grid(row=1, column=3, padx=10, pady=10)

update_countdown()
root.mainloop()

В конце функции добавим обновление root раз в секунду:

import tkinter as tk
from datetime import datetime

def update_countdown():
now = datetime.now()
new_year = datetime(now.year + 1, 1, 1, 0, 0, 0)

if now > new_year:
new_year = datetime(now.year, 1, 1, 0, 0, 0)

time_left = new_year - now

days = time_left.days
hours, remainder = divmod(time_left.seconds, 3600)
minutes, seconds = divmod(remainder, 60)

label_days.config(text=f"{days:02d}")
label_hours.config(text=f"{hours:02d}")
label_minutes.config(text=f"{minutes:02d}")
label_seconds.config(text=f"{seconds:02d}")
root.after(1000, update_countdown)

root = tk.Tk()
root.title("🎄 До Нового Года осталось:")
root.configure(bg='#0a2e36')

font_large = ("Courier", 48, "bold")
font_small = ("Arial", 14)

frame = tk.Frame(root, bg='#0a2e36')
frame.pack(expand=True)

tk.Label(frame, text="ДНЕЙ", font=font_small, bg='#0a2e36', fg='white').grid(row=0, column=0, padx=10)
tk.Label(frame, text="ЧАСОВ", font=font_small, bg='#0a2e36', fg='white').grid(row=0, column=1, padx=10)
tk.Label(frame, text="МИНУТ", font=font_small, bg='#0a2e36', fg='white').grid(row=0, column=2, padx=10)
tk.Label(frame, text="СЕКУНД", font=font_small, bg='#0a2e36', fg='white').grid(row=0, column=3, padx=10)

label_days = tk.Label(frame, text="00", font=font_large, bg='#1a4a5a', fg='#4afc9f', width=3)
label_hours = tk.Label(frame, text="00", font=font_large, bg='#1a4a5a', fg='#4afc9f', width=3)
label_minutes = tk.Label(frame, text="00", font=font_large, bg='#1a4a5a', fg='#4afc9f', width=3)
label_seconds = tk.Label(frame, text="00", font=font_large, bg='#1a4a5a', fg='#4afc9f', width=3)

label_days.grid(row=1, column=0, padx=10, pady=10)
label_hours.grid(row=1, column=1, padx=10, pady=10)
label_minutes.grid(row=1, column=2, padx=10, pady=10)
label_seconds.grid(row=1, column=3, padx=10, pady=10)

update_countdown()
root.mainloop()

Пример работы «Таймер обратного отсчёта до Нового Года на Python»

-2

Заключение

В ходе статьи мы с Вами написали код таймера обратного отсчёта до Нового Года на Python. Надеюсь Вам понравилась статья, желаю удачи и успехов! 🙂

Мой Telegram канал по Python

Мой YouTube канал