tkinterで前月や翌月のカレンダーを表示しよう
今回は前回のプログラムに戻すボタンと送りボタンを追加して、前月や翌月のカレンダーを表示できるようにしてみましょう。
なお、ボタンを使って表示する内容を切り替える処理は、こちらの記事も参照してください。
tkinterで前月や翌月のカレンダーを表示するプログラム
年と月のグローバル変数を用意して、押されたボタンによって月の値を1加算または1減算します。
月の値が1未満の場合は、年の値を1減算して月の値を12にします。
月の値が12よりも大きい場合は、年の値を1加算して月の値を1にします。
34~36行目でframe1の子ウィジェットの中からLabelウィジェットのみを削除していますが、Labelウィジェットかどうかの確認には、isinstance()関数を使います。
isinstance()関数は、オブジェクトの型が同じ場合はTrue、違う場合はFalseを返します。
isinstance(オブジェクト, オブジェクトの型)
また、比較するためのオブジェクトの型は、type()関数で取得できます。
type(オブジェクト)
実行例
>>> import tkinter
>>> label = tkinter.Label(text="ラベル")
>>> type(label)
<class 'tkinter.Label'>
isinstance()関数やtype()関数の詳しい使い方は、以下のドキュメントを参照してください。
ボタンを押下することによって、前月や翌月のカレンダーを表示するプログラムは、以下のようになります。
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 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 |
### インポート import datetime import calendar import tkinter ### 定数 WEEK = ["日", "月", "火", "水", "木", "金", "土"] ### 現在年月取得 year = datetime.date.today().year month = datetime.date.today().month ### 関数 def func(arg): ### グローバル変数定義 global year global month ### 月を変更 month += arg ### 月が1未満の場合は前年にする if month < 1: month = 12 year -= 1 ### 月が12より大きい場合は翌年にする elif month > 12: month = 1 year += 1 ### ラベルウィジェットを初期化 for widget in frame1.winfo_children(): if isinstance(widget, tkinter.Label): widget.destroy() ### ラベルに年月を設定 label = tkinter.Label(master=frame1, text=str(year) + "年" + str(month) + "月", font=("游ゴシック",20)) ### 年月表示 label.pack() ### カレンダーオブジェクト作成 cl = calendar.Calendar(firstweekday=6) ### 該当年月のカレンダーを取得 cal = cl.monthdayscalendar(year, month) ### ウィジェット初期化 for widget in frame2.winfo_children(): widget.destroy() ### 曜日配列を取得 for i,x in enumerate(WEEK): ### 日曜日は赤、土曜日は青にする if i == 0: label_day = tkinter.Label(master=frame2, text=x, font=("游ゴシック",18), width=3, fg="red") elif i == 6: label_day = tkinter.Label(master=frame2, text=x, font=("游ゴシック",18), width=3, fg="blue") else: label_day = tkinter.Label(master=frame2, text=x, font=("游ゴシック",18), width=3) ### 曜日を表示 label_day.grid(row=0, column=i, pady=2) ### 行カウンター row_cnt = 1 ### カレンダー配列を取得 for week in cal: for i,day in enumerate(week): ### 0だったら空白を設定 if day == 0: day = " " ### 日曜日は赤、土曜日は青にする if i == 0: label_day = tkinter.Label(master=frame2, text="{:>2}".format(day), font=("游ゴシック",18), height=1, fg="red") elif i == 6: label_day = tkinter.Label(master=frame2, text="{:>2}".format(day), font=("游ゴシック",18), height=1, fg="blue") else: label_day = tkinter.Label(master=frame2, text="{:>2}".format(day), font=("游ゴシック",18), height=1) ### 日にちを表示 label_day.grid(row=row_cnt, column=i, padx=2, pady=2) ### カウントアップ row_cnt = row_cnt + 1 ### メイン画面作成 main = tkinter.Tk() ### 画面サイズ設定 main.geometry("380x380") ### フレーム設定 frame1 = tkinter.Frame(master=main) frame2 = tkinter.Frame(master=main) ### フレーム表示 frame1.pack(pady=20, side="top") frame2.pack() ### ボタン作成 button1 = tkinter.Button(master=frame1, text="<", font=(None,12), command=lambda:func(-1)) button2 = tkinter.Button(master=frame1, text=">", font=(None,12), command=lambda:func(1)) ### ボタン表示 button1.pack(side="left") button2.pack(side="left") ### カレンダー表示 func(0) ### イベントループ main.mainloop() |
プログラムを実行すると、以下のような画面が表示され、「<」ボタンを押すと前月が、「>」ボタンを押すと翌月が表示されます。