tkinter で 年月を入力して12日を含む週が終わってから3回目の金曜日が翌月の何日かを表示します。
- 参考記事
実際に書いたコード
# 12日を含む週が終わってから3回目の金曜日が翌月の何日かを表示する
import tkinter as tk
from datetime import datetime, timedelta
def show_day():
year = year_entry.get()
month = month_entry.get()
day = "12"
# 入力が数字がどうかチェック
if not (year.isdigit() and month.isdigit() and day.isdigit()):
result_label.config(text="数字を入力してください")
return
try:
y = int(year)
m = int(month)
d = int(day)
dt = datetime(y, m, d)
except ValueError:
result_label.config(text="存在しない年月です")
return
# 12日を含む週が終わってから3回目の金曜日が翌月の何日かを計算
weekday_sunday0 = dt.isoweekday() % 7 # 日曜日=0 に変換
friday = d + 5 - weekday_sunday0 # 12日を含む週の金曜日
friday_3 = datetime(y, m, friday) + timedelta(
days=21
) # 12日を含む週の金曜日から3週間後
result_label.config(text=f"{friday_3.day}日")
# --- GUI構築 ---
root = tk.Tk()
root.title("12日を含む週が終わってから3回目の金曜日が翌月の何日かを表示")
root.geometry("600x200")
tk.Label(root, text="年").pack()
year_entry = tk.Entry(root)
year_entry.pack()
tk.Label(root, text="月").pack()
month_entry = tk.Entry(root)
month_entry.pack()
tk.Button(
root,
text="12日を含む週が終わってから3回目の金曜日が翌月の何日かを表示",
command=show_day,
).pack()
result_label = tk.Label(root, text="")
result_label.pack()
root.mainloop()
解説
from datetime import datetime, timedelta
datetime モジュールの datetime クラスと timedelta クラスを使うのでインポートしています。
12日を含む週が終わってから3回目の金曜日が翌月の何日かを計算
①12日が週のどこにあるかを「日曜=0」で求める
weekday_sunday0 = dt.isoweekday() % 7 # 日曜日=0 に変換
dt.isoweekday() は 月曜=1〜日曜=7 の番号を返します。
「週の基準を日曜=0」にしたいので、 7 で割った余りにすることで 日曜=0, 月曜=1, …, 土曜=6 に変換します。
② 12日を含む週の金曜日を求める
friday = d + 5 - weekday_sunday0
「日曜=0」を基準にすると、 金曜は週の 5 番目(日曜0 → 金曜5)
③ 金曜日から 3 週間(21日)後を求める
friday_3 = datetime(y, m, friday) + timedelta(days=21)
- 金曜日は 7 日周期なので 3 回目の金曜日 = 21 日後(7×3)
- datetime が月またぎを自動処理します
④ 翌月の「何日か」だけを取り出す
result_label.config(text=f"{friday_3.day}日")
friday_3.dayは 日付の「日」だけ- 月は自動で繰り上がっているので、翌月の「何日か」が正しく表示されます
⑤前提条件の確認
コードでは、「12日を含む週が終わってから3回目の金曜日は、必ず翌月になる」ということを前提条件としています。
確認:
12日が日曜日だった場合、金曜日は17日、3回目の金曜日=17日+21日=38日相当
12日が土曜日だった場合、金曜日は11日、3回目の金曜日=11日+21日=32日相当
月の日数の最大は 31 日、31日相当を必ず越えているので、翌月以降
月の日数の最小は 28 日の2倍の56日相当より必ず小さいので、今月または翌月
よって、必ず翌月になる
実行結果
Auto Py to Exe で、Windowsのexeアプリ化して、実行。



HR