Pythonば使って祝日が表示されるカレンダーば作成

Pythonば使って祝日が表示されるカレンダーば作成

Pythonば使って祝日が表示されるカレンダーば作成することはできるっちゃけど。Pythonには、カレンダー操作ば簡単にするためのライブラリがあって、「calendar」や「holidays」ライブラリば使うと、祝日が表示されるカレンダーば生成できるっちゃん。

ここでは、日本の祝日ば表示するために「jpholiday」ライブラリば使うとるけんね。

まず、必要なライブラリばインストールせんといかん。

pip install jpholiday

次に、以下のPythonコードば実行して祝日が表示されるカレンダーば生成するっちゃ。

import calendar
import jpholiday
from datetime import datetime

def print_calendar_with_holidays(year, month):
    # カレンダーば作成
    cal = calendar.TextCalendar(calendar.SUNDAY)
    month_calendar = cal.monthdayscalendar(year, month)

    # ヘッダーば表示
    print(cal.formatmonthname(year, month, 10, 0))
    print('日 月 火 水 木 金 土')

    for week in month_calendar:
        week_str = ''
        for day in week:
            if day == 0:
                week_str += '   '  # 日がない場所は空白にするっちゃん
            else:
                # 祝日かどうか確認するばい
                date = datetime(year, month, day)
                if jpholiday.is_holiday(date):
                    week_str += f'\033[91m{day:2}\033[0m '  # 祝日は赤色にするっちゃ
                else:
                    week_str += f'{day:2} '
        print(week_str)

# 2024年6月のカレンダーば表示
print_calendar_with_holidays(2024, 6)

このコードの説明は以下の通りばい:

  1. calendar.TextCalendarば使って指定された年と月のカレンダーば作成するっちゃん。
  2. 各週の日付ばループして表示するっちゃん。
  3. jpholiday.is_holiday(date)ば使って、その日が祝日かどうか確認するばい。
  4. 祝日の場合、日付ば赤色で表示するっちゃ(端末によっては赤色表示がサポートされてない場合もあるけんね)。

これば実行すると、指定された月のカレンダーが表示されて、祝日は赤色で表示されるっちゃん。例えば、2024年6月の場合、以下のように表示されるばい:

      June 2024
日 月 火 水 木 金 土
                   1 
 2  3  4  5  6  7  8 
 9 10 11 12 13 14 15 
16 17 18 19 20 21 22 
23 24 25 26 27 28 29 
30

祝日がある場合は、該当する日付が赤色で表示されるっちゃん。実際の祝日は、「jpholiday」ライブラリが日本の祝日ば正確に判定して表示するっちゃんね。

ガジェットとして作成

もちろん、祝日が表示されるカレンダーばガジェットとして作成することもできるばい。PythonとGUIライブラリば使って、デスクトップ上で動作するカレンダーガジェットば作成できるっちゃん。ここでは、tkinterライブラリば使ってシンプルなGUIカレンダーガジェットば作成する例ば示すけん。

import tkinter as tk
from tkinter import ttk
import calendar
import jpholiday
from datetime import datetime

class HolidayCalendar(tk.Tk):
    def __init__(self):
        super().__init__()
        self.title("祝日カレンダー")
        self.geometry("300x300")

        self.year = datetime.now().year
        self.month = datetime.now().month

        self.create_widgets()
        self.show_calendar(self.year, self.month)

    def create_widgets(self):
        self.header = ttk.Label(self, text="", font=("Helvetica", 16))
        self.header.pack(pady=10)

        self.calendar_frame = ttk.Frame(self)
        self.calendar_frame.pack()

        self.prev_button = ttk.Button(self, text="前の月", command=self.prev_month)
        self.prev_button.pack(side="left", padx=10, pady=10)

        self.next_button = ttk.Button(self, text="次の月", command=self.next_month)
        self.next_button.pack(side="right", padx=10, pady=10)

    def show_calendar(self, year, month):
        for widget in self.calendar_frame.winfo_children():
            widget.destroy()

        self.header.config(text=f"{year}年 {month}月")

        cal = calendar.TextCalendar(calendar.SUNDAY)
        month_calendar = cal.monthdayscalendar(year, month)

        days = ['日', '月', '火', '水', '木', '金', '土']
        for day in days:
            ttk.Label(self.calendar_frame, text=day).grid(row=0, column=days.index(day))

        for row, week in enumerate(month_calendar, 1):
            for col, day in enumerate(week):
                if day == 0:
                    ttk.Label(self.calendar_frame, text="").grid(row=row, column=col)
                else:
                    date = datetime(year, month, day)
                    if jpholiday.is_holiday(date):
                        ttk.Label(self.calendar_frame, text=str(day), foreground="red").grid(row=row, column=col)
                    else:
                        ttk.Label(self.calendar_frame, text=str(day)).grid(row=row, column=col)

    def prev_month(self):
        self.month -= 1
        if self.month == 0:
            self.month = 12
            self.year -= 1
        self.show_calendar(self.year, self.month)

    def next_month(self):
        self.month += 1
        if self.month == 13:
            self.month = 1
            self.year += 1
        self.show_calendar(self.year, self.month)

if __name__ == "__main__":
    app = HolidayCalendar()
    app.mainloop()

説明

  1. HolidayCalendarクラス:
    • tk.Tkば継承して、カレンダーガジェットのウィンドウば作成するばい。
    • 今の年月ば取得して、カレンダーば表示するっちゃん。
  2. create_widgetsメソッド:
    • ヘッダー、カレンダー表示フレーム、前の月と次の月に移動するボタンば作成するばい。
  3. show_calendarメソッド:
    • 指定された年と月のカレンダーば表示するっちゃん。
    • 祝日は赤色で表示するばい。
  4. prev_monthメソッド:
    • 前の月に移動する機能ば実装するっちゃん。
  5. next_monthメソッド:
    • 次の月に移動する機能ば実装するばい。

このコードば実行すると、デスクトップに祝日が表示されるカレンダーガジェットが表示されるけん。ユーザーはボタンば使って月ば移動できるっちゃん。祝日は赤色で表示されるようになっとるけんね。

素晴らしい?!?!

tkinter以外の「simpleなにがし」tkinterは難しいのでないか

pythonは書けるが、mq4は書くことが出来ない。禁止されている。

どこらへんまで禁止されているのか