PythonのTkinterでカレンダー(datepicker)を使用する

2021年3月22日

Tkinterのdatepickerとして、tkcalendar」を触ってみました。

■どんなもの?

tkcalendar」には2種類のウィジェットがあり、

カレンダーウィジェット(右側)と、

コンボボックスを押すと、カレンダーが開くDateEntryウィジェット(左側)があります。

コンボボックスを押すと下にカレンダーが開きます

よくあるdatepickerです

■実装してみる

使用しているPythonのversionは「3.7.7」です。

こちらがtkcalenderのドキュメントです

インストール

 pip install tkcalendar

実装

import tkinter
from tkcalendar import Calendar, DateEntry

class TestTkcalender(tkinter.Frame):

    def __init__(self,master):
        super().__init__(master)
        self.pack()
        self.master.title("tkカレンダーテスト")
        self.master.geometry("800x600")

        self.data_entry_date = DateEntry()
        self.data_entry_date.place(x=250, y=230)

        self.calender_date = Calendar()
        self.calender_date.place(x=500, y=230)

def main():
    root = tkinter.Tk()
    root = TestTkcalender(master=root)
    root.mainloop()

if __name__ == "__main__":
    main()

これがで上記のとおりに表示されました。

コンボボックスのスタイルが変更できるみたいです。

tkcalender公式ドキュメントのHowToを使ってみましょう。

import tkinter
from tkinter import ttk
from tkcalendar import Calendar, DateEntry

class TestTkcalender(tkinter.Frame):

    def __init__(self,master):
        super().__init__(master)
        self.pack()
        self.master.title("tkカレンダーテスト")
        self.master.geometry("800x600")

        # カレンダーのスタイル
        style = ttk.Style()
        style.theme_use('clam')
        style.configure('my.DateEntry',
                        fieldbackground='light green',
                        background='dark green',
                        foreground='dark orange',
                        arrowcolor='white')

        self.data_entry_date = DateEntry(style='my.DateEntry')
        self.data_entry_date.place(x=250, y=230)

        self.calender_date = Calendar()
        self.calender_date.place(x=500, y=230)

def main():
    root = tkinter.Tk()
    root = TestTkcalender(master=root)
    root.mainloop()

if __name__ == "__main__":
    main()

コンボボックスの背景と文字色が変わっていますね。

選択した日付を取得してみましょう「get_date()」で取得できます

import tkinter
from tkinter import ttk
from tkcalendar import Calendar, DateEntry

class TestTkcalender(tkinter.Frame):

    def __init__(self,master):
        super().__init__(master)
        self.pack()
        self.master.title("tkカレンダーテスト")
        self.master.geometry("800x600")

        # カレンダーのスタイル
        style = ttk.Style()
        style.theme_use('clam')
        style.configure('my.DateEntry',
                        fieldbackground='light green',
                        background='dark green',
                        foreground='dark orange',
                        arrowcolor='white')

        self.data_entry_date = DateEntry(style='my.DateEntry')
        self.data_entry_date.place(x=250, y=230)

        self.calender_date = Calendar()
        self.calender_date.place(x=500, y=230)

        self.print_button = tkinter.Button(master, text="プリント", bg="coral", font=("Times New Roman", 20), command=self.click_print)
        self.print_button.place(x=400, y=150, width=150, height=50)

    def click_print(self):
        print(self.data_entry_date.get_date())
        print(self.calender_date.get_date())

def main():
    root = tkinter.Tk()
    root = TestTkcalender(master=root)
    root.mainloop()

if __name__ == "__main__":
    main()

2021-03-18
2021-03-31

プリントを押してみると、日付がログに取得されていることが確認できますね。

※※※2021/03/22追記※※※

すっかり見落としていたものがあります。

赤枠で囲んだ部分です。

これは週番号(1月の第1週目が1番)といわれるものです。

あまり用途がないので消しましょう。

公式ドキュメント内の「showweeknumbers」に表示(True)・非表示(False)の記載がありますので、使ってみましょう。

22から26行目を修正

        self.data_entry_date = DateEntry(style='my.DateEntry', showweeknumbers=False)
        self.data_entry_date.place(x=250, y=230)

        self.calender_date = Calendar(showweeknumbers=False)
        self.calender_date.place(x=500, y=230)

週番号が無事消えました。

他にも、DateEntryウィジェットのコンボボックスに表示されているの日付フォーマットを変えられたりもできるみたいですね。