Mundo em Python

Calendário em que tem os feriados em Portugal

from tkinter import *
import calendar
from datetime import date, timedelta # Lista de feriados fixos (mês, dia)
feriados_fixos = [
(1, 1), # Ano Novo
(4, 25), # Dia da Liberdade
(5, 1), # Dia do Trabalhador
(6, 10), # Dia de Portugal
(8, 15), # Assunção de Nossa Senhora
(10, 5), # Implantação da República
(11, 1), # Dia de Todos os Santos
(12, 1), # Restauração da Independência
(12, 8), # Imaculada Conceição
(12, 25) # Natal
] # Função para calcular a Páscoa
def calcular_pascoa(ano):
a = ano % 19
b = ano // 100
c = ano % 100
d = b // 4
e = b % 4
f = (b + 8) // 25
g = (b - f + 1) // 3
h = (19 * a + b - d - g + 15) % 30
i = c // 4
k = c % 4
l = (32 + 2 * e + 2 * i - h - k) % 7
m = (a + 11 * h + 22 * l) // 451
mes = (h + l - 7 * m + 114) // 31
dia = ((h + l - 7 * m + 114) % 31) + 1
return date(ano, mes, dia) # Função para obter todos os feriados (fixos e móveis)
def obter_feriados(ano):
feriados = [date(ano, mes, dia) for mes, dia in feriados_fixos]
pascoa = calcular_pascoa(ano)
feriados_moveis = [
pascoa, # Domingo de Páscoa
pascoa + timedelta(days=60) # Corpo de Deus (60 dias após a Páscoa)
]
return set(feriados + feriados_moveis) # Função para exibir o calendário com feriados
def exibir_calendario_com_feriados(ano, mes):
feriados = obter_feriados(ano)
cal = calendar.TextCalendar(calendar.SUNDAY)
semanas = cal.monthdayscalendar(ano, mes)
resultado = f"Calendário de {calendar.month_name[mes]} {ano}\n"
resultado += "Dom Seg Ter Qua Qui Sex Sáb\n"

for semana in semanas:
for dia in semana:
if dia == 0: # Dias fora do mês
resultado += " "
else:
data_atual = date(ano, mes, dia)
if data_atual in feriados:
resultado += f" F " # F para feriado
else:
resultado += f"{dia:2} "
resultado += "\n"
return resultado # Interface gráfica
root = Tk()
root.geometry("500x550")
root.resizable(0, 0)
root.config(bg="#103030")
root.title("Calendário") # Elementos da interface
titulo = Label(text="Calendário",
font=("Arial", 30, "bold"), bg="#103030", fg="#49e3e3")
titulo.place(relx=0.28, rely=0.05) texto_sub1 = Label(text="Ano (ex.: 2024):",
font=("Arial", 18, "bold"), bg="#103030", fg="#49e3e3")
texto_sub1.place(relx=0.15, rely=0.2) texto_sub2 = Label(text="Mês (1-12):",
font=("Arial", 18, "bold"), bg="#103030", fg="#49e3e3")
texto_sub2.place(relx=0.23, rely=0.35) Ano = StringVar()
Ano_entrada = Entry(textvariable=Ano,
font=("Arial", 12, "bold"),
bg="white", fg="blue", justify='center')
Ano_entrada.place(relx=0.57, rely=0.21, relwidth=0.3)
Ano_entrada.focus() Mês = StringVar()
Mês_entrada = Entry(textvariable=Mês,
font=("Arial", 12, "bold"),
bg="white", fg="blue", justify='center')
Mês_entrada.place(relx=0.57, rely=0.36, relwidth=0.3)
resultado_texto = Label(text="",
font=("Courier", 12, "bold"), bg="#cfe2f3", justify="center")
resultado_texto.place(relx=0.05, rely=0.65, relwidth=0.9, relheight=0.3) # Funções dos botões
def limpar():
Mês_entrada.delete(0, END)
Ano_entrada.delete(0, END)
resultado_texto.config(text="") def app():
try:
ano = int(Ano.get())
mes = int(Mês.get())
if mes < 1 or mes > 12:
resultado_texto.config(text="Mês inválido! Use valores entre 1 e 12.")
return
calendario = exibir_calendario_com_feriados(ano, mes)
resultado_texto.config(text=calendario)
except ValueError:
resultado_texto.config(text="Erro! Insira valores válidos para ano e mês.") but1 = Button(text="Verificar", bd=2, bg='#107db2', fg='white',
font=('verdana', 12, 'bold'), command=app)
but1.place(relx=0.1, rely=0.45, relwidth=0.25, relheight=0.1) but_limpar = Button(text="Limpar", bd=2, bg='#107db2', fg='white',
font=('verdana', 12, 'bold'), command=limpar)
but_limpar.place(relx=0.4, rely=0.45, relwidth=0.25, relheight=0.1) but_sair = Button(text="Sair", bd=2, bg='#107db2', fg='white',
font=('verdana', 12, 'bold'), command=root.destroy)
but_sair.place(relx=0.7, rely=0.45, relwidth=0.25, relheight=0.1) root.mainloop()
0