Добавить в корзинуПозвонить
Найти в Дзене

Программа для вычисления даты православной Троицы на Python

*** import tkinter as tk from tkinter import messagebox from datetime import date, timedelta def orthodox_easter(year: int) -> date: """ Расчёт даты православной Пасхи по александрийской пасхалии. Возвращает дату по юлианскому календарю. """ a = year % 19 b = year % 7 c = year % 4 d = (19 * a + 15) % 30 e = (2 * c + 4 * b + 6 * d + 6) % 7 # Дни в марте (1 марта = 1, 31 марта = 31) days_in_march = d + e if days_in_march <= 9: # Пасха в марте (по юлианскому) return date(year, 3, 22 + days_in_march) else: # Пасха в апреле (по юлианскому) return date(year, 4, days_in_march - 9) def julian_to_gregorian(julian_date: date) -> date: """ Переводит дату из юлианского календаря в григорианский. Разница: 13 дней для XX и XXI веков, но для корректности вычисляем: григорианская дата = юлианская дата + 13 дней (c 1900 по 2099 гг.) Упрощённо: +13 дней с учётом перехода через конец месяца/года. """ return julian_date + timedelta(days=13) def calculate_trinity(year: int) -> date: """ Рассчитывает дат
Оглавление

Код программы на Python (с графическим интерфейсом), которая рассчитывает дату православной Троицы (50-й день после Пасхи) по александрийской пасхалии с поправкой на григорианский календарь.

***

import tkinter as tk

from tkinter import messagebox

from datetime import date, timedelta

def orthodox_easter(year: int) -> date:

"""

Расчёт даты православной Пасхи по александрийской пасхалии.

Возвращает дату по юлианскому календарю.

"""

a = year % 19

b = year % 7

c = year % 4

d = (19 * a + 15) % 30

e = (2 * c + 4 * b + 6 * d + 6) % 7

# Дни в марте (1 марта = 1, 31 марта = 31)

days_in_march = d + e

if days_in_march <= 9:

# Пасха в марте (по юлианскому)

return date(year, 3, 22 + days_in_march)

else:

# Пасха в апреле (по юлианскому)

return date(year, 4, days_in_march - 9)

def julian_to_gregorian(julian_date: date) -> date:

"""

Переводит дату из юлианского календаря в григорианский.

Разница: 13 дней для XX и XXI веков, но для корректности вычисляем:

григорианская дата = юлианская дата + 13 дней (c 1900 по 2099 гг.)

Упрощённо: +13 дней с учётом перехода через конец месяца/года.

"""

return julian_date + timedelta(days=13)

def calculate_trinity(year: int) -> date:

"""

Рассчитывает дату православной Троицы (50-й день после Пасхи).

"""

easter_julian = orthodox_easter(year)

easter_gregorian = julian_to_gregorian(easter_julian)

# Троица – 50-й день после Пасхи (Пасха = 1-й день, поэтому +49 дней)

trinity = easter_gregorian + timedelta(days=49)

return trinity

def format_date(d: date) -> str:

"""Форматирует дату как DD.MM.YYYY"""

return d.strftime("%d.%m.%Y")

class TrinityApp:

def __init__(self, root):

self.root = root

self.root.title("Православная Троица – калькулятор даты")

self.root.geometry("400x250")

self.root.resizable(False, False)

# Текущая дата Троицы при запуске

current_year = date.today().year

current_trinity = calculate_trinity(current_year)

# Метка с результатом для текущего года

tk.Label(root, text="Дата Троицы для текущего года:", font=("Arial", 10)).pack(pady=(10, 0))

self.current_label = tk.Label(root, text=format_date(current_trinity), font=("Arial", 14, "bold"), fg="green")

self.current_label.pack(pady=5)

# Разделитель

tk.Frame(root, height=2, bd=1, relief=tk.SUNKEN).pack(fill=tk.X, padx=10, pady=10)

# Поле ввода года

tk.Label(root, text="Введите год (положительное число):", font=("Arial", 10)).pack()

self.year_entry = tk.Entry(root, font=("Arial", 12), width=10)

self.year_entry.pack(pady=5)

# Кнопка расчёта

self.calc_button = tk.Button(root, text="Рассчитать", command=self.calculate, bg="#4CAF50", fg="white", font=("Arial", 10))

self.calc_button.pack(pady=5)

# Метка для вывода результата

self.result_label = tk.Label(root, text="", font=("Arial", 12), fg="blue")

self.result_label.pack(pady=10)

# Обработка нажатия Enter в поле ввода

self.year_entry.bind("<Return>", lambda event: self.calculate())

def calculate(self):

year_str = self.year_entry.get().strip()

if not year_str:

messagebox.showwarning("Ошибка ввода", "Пожалуйста, введите год.")

return

try:

year = int(year_str)

if year <= 0:

messagebox.showwarning("Ошибка ввода", "Год должен быть положительным числом (больше 0).")

return

if year < 1000 or year > 9999:

# Ограничим разумными пределами (формула работает для большинства лет)

if not messagebox.askyesno("Предупреждение", "Год выходит за пределы 1000–9999. Результат может быть неточным. Продолжить?"):

return

except ValueError:

messagebox.showwarning("Ошибка ввода", "Введите целое число (год).")

return

trinity = calculate_trinity(year)

self.result_label.config(text=f"Троица в {year} году: {format_date(trinity)}")

if __name__ == "__main__":

root = tk.Tk()

app = TrinityApp(root)

root.mainloop()

-2

***

Как это работает:

1. Александрийская пасхалия – функция orthodox_easter() вычисляет дату православной Пасхи по юлианскому календарю по формуле Гаусса (православный вариант).

2. Переход на григорианский календарь – к юлианской дате Пасхи прибавляется 13 дней (разница между календарями для XX-XXI вв.). Функция julian_to_gregorian() использует timedelta, корректно обрабатывая переход через конец месяца/года.

3. Троица – 50-й день после Пасхи: Пасха + 49 дней.

4. Интерфейс:

– При запуске автоматически показывает дату Троицы для текущего года.

– Поле ввода для года с проверкой (положительное целое число).

– Кнопка "Рассчитать" и поддержка нажатия на клавишу Enter.

– Вывод в формате DD.MM.YYYY.

***

Примечание

Встроенный текстовый dzen-редактор не позволяет сохранять отступы в публикуемом программном коде (отсутствие этих отступов в Python приведёт к ошибке!).