Checklist - Контрольный список

Checklist (Чек-лист) – это список, содержащий ряд необходимых заданий для выполнения. Отмечая пункты списка, можно видеть какие задания уже выполнены, а какие нет. Работая по чек-листу, исключена вероятность забывания.

Примеров использования чек листа будет реализация этого проекта. Будем придумывать, записывать и выполнять шаги по мере решения.😉

Step 0 - Шаг 0: Поиск аналога

Часто идея начинается с поиска похожих решений и их визуального представления.

Пример чек-листа:

checklist_01

Получив визуальный образ, теперь понятно к чему стремиться.

Step 1 - Шаг 1: Создание статичного интерфейса

Создадим пустое окно с заголовком «Checklist»:

checklist_02

Основное расположение элементов в окне вертикальное, для этого будем создавать фреймы и располагать их друг за другом вертикально. Внутри фреймов виджеты будут располагаться горизонтально.

Создадим заголовок чек листа:

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)
1
2
3
4

Labelframe используем с подписью для наглядности визуального расположения. fill=X, expand=1 - команды указывающие на горизонтальное растяжение элементов.

Результат выполнения:

checklist_03

Т.к. поле описания будет располагаться ниже и состоять из одно виджета, то его можно создать без использования фрейма:

list_description = Text(height=2, width=50)
list_description.pack(fill=X)
1
2

Результат выполнения:

checklist_04

Теперь добавим поле для названия задания и кнопку, при нажатии которой, эта задача будет добавляться в список заданий:

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)
1
2
3
4
5

Результат выполнения:

checklist_05

Последним статичными виджетами будет фрейм в котором будут добавляться задачи. И расположим в нем метку с описанием:

frm_tasks = Labelframe(text="Tasks")
Label(frm_tasks, text="Here will be added new tasks...").pack()
frm_tasks.pack(fill=BOTH, expand=1)
1
2
3

Результат выполения:

checklist_06

Step 2 - Шаг 2: Создание динамичного интерфейса

Создадим функцию которая будет вызваться при нажатии кнопки «+» и, для начала, выводит в консоль содержимое поля с название задания:

def add_task():
    print(task.get())
1
2

В кнопке пропишем вызов этой функции:

button_add = Button(frm_add, text="+", width=5, command=add_task).pack(side=LEFT)
1

В результате выполнения, в консоль должно выводится то, что напечатано в поле:

checklist_07

Созданная функция будет добавлять Checkbutton с данной подписью во фрейм Tasks. Для корректной работы генерируемого списка нужно создать список в котором будут храниться значения переменных флажков. Создадим переменную вначале программы:

from tkinter import *
from tkinter.ttk import *

added_tasks = []
1
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()
1
2
3
4

added_tasks.len() - служебная команда python, для получения размера длинны списка. added_tasks[added_tasks.len()-1] - указывает на номер позицию флажка в списке.

Результат выполнения:

checklist_08

Упражнения

  1. Зная, что команда added_tasks.len() возвращает длину списка, а text= указывает какой текст подписать. Сделайте подписью Checkbutton длину списка, на момент создания нового виджета:

    checklist_11

  2. Зная, что номера в списках и массивах в программировании всегда считаются с нуля, т.е. 0, 1, 2 и т.д. Сделайте подписью Checkbutton номер элемента в списке:

    checklist_12

  3. Сделайте подписью Checkbutton надпись: «Задание <№>: <текст задания из поля Entry>», где номер и текст изменяются соответсвенно:

    checklist_13

  4. Используя дополнительный фрейм, сделайте расположение элементов слева:

    checklist_14

  5. Добавьте кнопку «-» расположенную справа, для каждого флажка:

    checklist_15

  6. Добавьте кнопке «-» метод удаления соответствующего фрейма, для для удаления ненужных заданий.

  7. Удалите подписи фреймов. Удалите подпись: «Here will be added new tasks…».

  8. Добавьте очистку поля Entry после добавления задания.

    checklist_16