Одна из первых программ, которую можно попробовать написать на Python — это календарь. Она не сложная, но при всем при этом, с её помощью можно потренировать навыки работы со стандартными библиотеками Tkinter и calendar.
Описание программы
Календарь написан на Python 3 с помощью графической библиотеки Tkinter. Для определения текущего дня недели и количества дней в месяце использовалась стандартная библиотека calendar. Будем отображать календарь на текущий месяц в виде таблицы. Текущую дату выделим зелёным цветом. Также добавим кнопки для перелистывания месяцев.
Подключение библиотек и объявление переменных
Подключаем стандартные библиотеки Tkinter, datetime и calendar с помощью import. Инициализируем класс root, с помощью которого будет отрисовываться графический интерфейс. Задаем заголовок окна «Calendar». Объявляем пустой список days
. В дальнейшем в нем будут храниться поля таблицы. Каждое такое поле соответствует определенному дню.
В переменную now будем хранить текущую дату. В переменных year
и month
будут храниться год и месяц, календарь которых в данный момент отображается.
from tkinter import * import calendar import datetime root = Tk() root.title('Calendar') days = [] now = datetime.datetime.now() year = now.year month = now.month
Меняем текущий месяц
Функции prew
и next
будут вызываться при нажатии на одну из клавиш смены месяца. Если текущее значение месяца «январь» и пользователь нажмет на кнопку перехода на предыдущий месяц, то тогда уменьшится год и месяц поменяет значение на «декабрь».
Обратите внимание на то, что переменные month
и year
глобальные. Поэтому перед изменением их значения в функции необходимо использовать ключевое слово global
.
Функция fill
перерисовывает календарь.
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()
Перерисовка календаря
В функции fill
будет перерисовываться отображение всех элементов. Она будет вызываться в начале работы программы и каждый раз после изменения месяца, для которого нужно вывести календарь.
Вначале выводим наименование месяца и год. Вычисляем количество дней в предыдущем месяце и записываем в переменную prew_month_days
. В переменноу week_day
запишем номер дня недели первого числа месяца (от 0 – если первое число выпадет на понедельник, до 6 — на воскресенье).
После этого в трех циклах выводим числа и их корректируем их цвета:
- В первом цикле заполняем номера дней выбранного месяца. Отображать будем их черным цветом. Если это текущий день, то его фон делаем зелёным.
- Во втором цикле заполняем числа предыдущего месяца. Они отображаться будут серым цветом.
- В третьем цикле добавляем числа следующего месяца. Их также выводим серым цветом.
def fill(): info_label['text'] = calendar.month_name[month] + ', ' + str(year) month_days = calendar.monthrange(year, month)[1] if month == 1: prew_month_days = calendar.monthrange(year-1, 12)[1] else: prew_month_days = calendar.monthrange(year, month - 1)[1] week_day = calendar.monthrange(year, month)[0] 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'
Отображение элементов
Для отображения календаря в Python 3 мы используем библиотеку Tkinter. Воспользуемся её упаковщиком grid
. Он представит все создаваемые нами элементы в виде таблицы.
В первой строке в крайней левой и крайней правой ячейках (с номерами столбцов 0 и 6) отобразим кнопки смены месяцев. По центру выведем текстовое поле, в котором будет отображаться текущий год и месяц. Это поле будет занимать 5 ячеек таблицы, поэтому выставим параметр columnspan
в 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')
Во второй строке выведем сокращенные названия месяцев.
Дальше отображаем 6 строк по 7 столбцов, которые будем заполнять числами, обозначающими номера дней.
В завершении используем функцию fill
, которая заполнит наш календарь начальными данными – календарем текущего месяца. После этого запустим цикл обработки событий mainloop
.
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()
Пример программы на Python 3 для вывода календаря с помощью библиотеки Tkinter достаточно прост. Он поможет программистам в изучении языка. Здесь у нас представлены различные условные операторы и циклы, работа с глобальными переменными в функциях. Самое сложное в этом примере – это отображение графических элементов.
Пример можно усложнить и выводить календарь сразу на весь год. Для этого надо будет использовать классы.