One of the first programs you can try in Python is a calendar. It is not hard, but it is a good way to train your skills with the standard Tkinter and calendar libraries.
The calendar is written in Python 3 using the Tkinter graphical library. The standard calendar library was used to determine the current day of the week and the number of days in the month. We will display the calendar for the current month as a table. The current date will be highlighted in green. We will also add buttons to flip through the months.
Connecting libraries and declaring variables
Include the standard libraries Tkinter, datetime, and calendar with import. Initialize the root class that will be used to draw the graphical interface. Specify the “Calendar” window title. Declare an empty list of
days. In the future, it will store the fields of the table. Each field corresponds to a certain day. In the variable now we will store the current date. Variables
month will store the year and month, which calendar is currently displayed.
from tkinter import * import calendar import datetime root = Tk() root.title('Calendar') days =  now = datetime.datetime.now() year = now.year month = now.month
Change the current month
next functions will be called when one of the month change keys is pressed. If the current month is “January” and the user presses the change to the previous month button, the year will be decremented and the month will change to “December”. Note that the
year variables are global. Therefore, you must use the keyword
global before changing their values in the function. The
fill function redraws the calendar.
def prew(): global month, year month -= 1 if month == 0: month = 12 year -= 1 fill() def next(): global month, year month += 1 if month == 13: month = 1 year += 1 fill()
Redrawing the calendar
fill function will redraw the display of all items. It will be called at the beginning of the program, and every time the month for which you want to display the calendar changes. First, we output the name of the month and the year. We calculate the number of days in previous month and write it into
prew_month_days variable. In the variable
week_day we write the number of day of the week of the first day of the month (from 0 – if the first day falls on Monday, to 6 – on Sunday). After that, in three cycles we output the numbers and correct their colors:
- In the first cycle, fill in the day numbers of the selected month. We will display them in black. If it is the current day, its background is green.
- In the second cycle we fill in the numbers of the previous month. They will be displayed in gray.
- In the third loop, we add the next month’s numbers. They are also displayed in gray.
def fill(): info_label['text'] = calendar.month_name[month] + ', ' + str(year) month_days = calendar.monthrange(year, month) if month == 1: prew_month_days = calendar.monthrange(year-1, 12) else: prew_month_days = calendar.monthrange(year, month - 1) week_day = calendar.monthrange(year, month) for n in range(month_days): days[n + week_day]['text'] = n+1 days[n + week_day]['fg'] = 'black' if year == now.year and month == now.month and n == now.day: days[n + week_day]['background'] = 'green' else: days[n + week_day]['background'] = 'lightgray' for n in range(week_day): days[week_day - n - 1]['text'] = prew_month_days - n days[week_day - n - 1]['fg'] = 'gray' days[week_day - n - 1]['background'] = '#f3f3f3' for n in range(6*7 - month_days - week_day): days[week_day + month_days + n]['text'] = n+1 days[week_day + month_days + n]['fg'] = 'gray' days[week_day + month_days + n]['background'] = '#f3f3f3'
To display the calendar in Python 3 we use the Tkinter library. We will use its
grid packer. It will present all elements we create as a table. In the first row in the leftmost and rightmost cells (with column numbers 0 and 6) we will display the buttons for changing months. In the center, we will display a text field that will display the current year and month. This field will occupy 5 table cells, so set the
columnspan parameter to 5.
prew_button = Button(root, text='<', command=prew) prew_button.grid(row=0, column=0, sticky='nsew') next_button = Button(root, text='>', command=next) next_button.grid(row=0, column=6, sticky='nsew') info_label = Label(root, text='0', width=1, height=1, font=('Verdana', 16, 'bold'), fg='blue') info_label.grid(row=0, column=1, columnspan=5, sticky='nsew')
In the second line we display the abbreviated names of the months. Next we will display 6 rows of 7 columns, which we will fill with numbers denoting day numbers. Finally, we use the
fill function, which will fill our calendar with the initial data – the calendar of the current month. After that we run the
mainloop event loop.
for n in range(7): lbl = Label(root, text=calendar.day_abbr[n], width=1, height=1, font=('Verdana', 10, 'normal'), fg='darkblue') lbl.grid(row=1, column=n, sticky='nsew') for row in range(6): for col in range(7): lbl = Label(root, text='0', width=4, height=2, font=('Verdana', 16, 'bold')) lbl.grid(row=row+2, column=col, sticky='nsew') days.append(lbl) fill() root.mainloop()
The example program in Python 3 to output the calendar using the Tkinter library is quite simple. It will help programmers in learning the language. Here we have different conditional statements and loops, working with global variables in functions. The hardest part of this example is displaying graphical elements. This example can be more complicated and display the calendar for the whole year at once. To do this, you will need to use classes.