GTK3 Calendar dialog example in Python.

Open a calendar in a Gtk window and get the user’s selected values in the main App class.

#!/usr/bin/python3
import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk, Gio, GObject
GObject.threads_init()

class CalDialog(Gtk.Dialog):
    '''
    Calendar Dialog
    '''
    def __init__(self, parent):
        Gtk.Dialog.__init__(self, "Select Date", parent, 0,
            (Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL,
             Gtk.STOCK_OK, Gtk.ResponseType.OK))

        self.set_default_size(300, 200)

        self.value = None

        box = self.get_content_area()

        calendar = Gtk.Calendar()
        calendar.set_detail_height_rows(1)
        calendar.set_property("show-details",True)
        calendar.set_detail_func(self.cal_entry)

        box.add(calendar)

        self.show_all()

    def cal_entry(self, calendar, year, month, date):
        #print(year, month, date)
        self.value = calendar.get_date()

class FlowBoxWindow(Gtk.Window):
    '''
    Flowbox example mixed with HeaderBar from
    https://python-gtk-3-tutorial.readthedocs.io/en/latest/introduction.html
    '''
    def __init__(self):
        Gtk.Window.__init__(self, title="Calendar Demo")
        self.flowbox = None
        self.set_border_width(10)
        self.set_default_size(400, 250)

        header = Gtk.HeaderBar(title="Calendar Demo")
        header.props.show_close_button = True

        # Add button to header to display calendar dialog.
        cal_button = Gtk.Button()
        icon_cal = Gio.ThemedIcon(name="gnome-calendar")
        image_cal = Gtk.Image.new_from_gicon(icon_cal, Gtk.IconSize.BUTTON)
        cal_button.add(image_cal)
        cal_button.set_tooltip_text("Pick date")
        cal_button.connect("clicked", self.on_cal_clicked)
        header.pack_start(cal_button)

        # Button to exit main window.
        exit_button = Gtk.Button()
        icon_exit = Gio.ThemedIcon(name="exit")
        image_exit = Gtk.Image.new_from_gicon(icon_exit, Gtk.IconSize.BUTTON)
        exit_button.add(image_exit)
        exit_button.set_tooltip_text("Exit")
        exit_button.connect("clicked", self.on_exit_clicked)
        header.pack_start(exit_button)

        self.set_titlebar(header)

        self.flowbox = Gtk.FlowBox()
        self.flowbox.set_valign(Gtk.Align.START)
        self.flowbox.set_max_children_per_line(30)
        self.flowbox.set_selection_mode(Gtk.SelectionMode.NONE)
        self.flowbox.set_property("vexpand", False)

        self.show_all()

    def on_cal_clicked(self, widget):
        # Open calender and get user selection,
        dialog = CalDialog(self)
        response = dialog.run()
        if response == Gtk.ResponseType.OK:
            print(dialog.value) # See terminal.
        # Close calendar.
        dialog.destroy()

    def on_exit_clicked(self, widget):
        self.destroy()

win = FlowBoxWindow()
win.connect("destroy", Gtk.main_quit)
win.show_all()
Gtk.main()