Checklist - Контрольный список
Checklist (Чек-лист) – это список, содержащий ряд необходимых заданий для выполнения. Отмечая пункты списка, можно видеть какие задания уже выполнены, а какие нет. Работая по чек-листу, исключена вероятность забывания.
Примеров использования чек листа будет реализация этого проекта. Будем придумывать, записывать и выполнять шаги по мере решения.😉
Step 0 - Шаг 0: Поиск аналога
Часто идея начинается с поиска похожих решений и их визуального представления.
Пример чек-листа:
Получив визуальный образ, теперь понятно к чему стремиться.
Step 1 - Шаг 1: Создание статичного интерфейса
Создадим пустое окно с заголовком «Checklist»:
Основное расположение элементов в окне вертикальное, для этого будем создавать фреймы и располагать их друг за другом вертикально. Внутри фреймов виджеты будут располагаться горизонтально.
Создадим заголовок чек листа:
frm_title = Labelframe(text="Title")
lbl_title = Label(frm_title, text="The list title:").pack(side=LEFT)
list_title = Entry(frm_title).pack(side=LEFT, fill=X, expand=1)
frm_title.pack(fill=X)
2
3
4
Labelframe
используем с подписью для наглядности визуального расположения. fill=X
, expand=1
- команды указывающие на горизонтальное растяжение элементов.
Результат выполнения:
Т.к. поле описания будет располагаться ниже и состоять из одно виджета, то его можно создать без использования фрейма:
list_description = Text(height=2, width=50)
list_description.pack(fill=X)
2
Результат выполнения:
Теперь добавим поле для названия задания и кнопку, при нажатии которой, эта задача будет добавляться в список заданий:
task = StringVar()
frm_add = Labelframe(text="Add a note")
frm_add.pack(fill=X)
note_add = Entry(frm_add, textvariable=task).pack(side=LEFT, fill=X, expand=1)
button_add = Button(frm_add, text="+", width=5).pack(side=LEFT)
2
3
4
5
Результат выполнения:
Последним статичными виджетами будет фрейм в котором будут добавляться задачи. И расположим в нем метку с описанием:
frm_tasks = Labelframe(text="Tasks")
Label(frm_tasks, text="Here will be added new tasks...").pack()
frm_tasks.pack(fill=BOTH, expand=1)
2
3
Результат выполения:
Step 2 - Шаг 2: Создание динамичного интерфейса
Создадим функцию которая будет вызваться при нажатии кнопки «+» и, для начала, выводит в консоль содержимое поля с название задания:
def add_task():
print(task.get())
2
В кнопке пропишем вызов этой функции:
button_add = Button(frm_add, text="+", width=5, command=add_task).pack(side=LEFT)
В результате выполнения, в консоль должно выводится то, что напечатано в поле:
Созданная функция будет добавлять Checkbutton с данной подписью во фрейм Tasks. Для корректной работы генерируемого списка нужно создать список в котором будут храниться значения переменных флажков. Создадим переменную вначале программы:
from tkinter import *
from tkinter.ttk import *
added_tasks = []
2
3
4
Изменим вызываемую функцию:
def add_task():
print(added_tasks.__len__())
added_tasks.append(BooleanVar())
Checkbutton(frm_tasks, text=task.get(), variable=added_tasks[added_tasks.__len__()-1]).pack()
2
3
4
added_tasks.len() - служебная команда python, для получения размера длинны списка. added_tasks[added_tasks.len()-1] - указывает на номер позицию флажка в списке.
Результат выполнения:
Упражнения
Зная, что команда added_tasks.len() возвращает длину списка, а text= указывает какой текст подписать. Сделайте подписью Checkbutton длину списка, на момент создания нового виджета:
Зная, что номера в списках и массивах в программировании всегда считаются с нуля, т.е. 0, 1, 2 и т.д. Сделайте подписью Checkbutton номер элемента в списке:
Сделайте подписью Checkbutton надпись: «Задание <№>: <текст задания из поля Entry>», где номер и текст изменяются соответсвенно:
Используя дополнительный фрейм, сделайте расположение элементов слева:
Добавьте кнопку «-» расположенную справа, для каждого флажка:
Добавьте кнопке «-» метод удаления соответствующего фрейма, для для удаления ненужных заданий.
Удалите подписи фреймов. Удалите подпись: «Here will be added new tasks…».
Добавьте очистку поля Entry после добавления задания.