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()  | 
					
プログラムを実行すると、以下のような画面が表示され、「<」ボタンを押すと前月が、「>」ボタンを押すと翌月が表示されます。
