Skip to content

6. (П3) Побудова адаптивного інтерфейсу: панель нотаток

Передумови

Мова в коді

Усі рядкові літерали, написи на віджетах, заголовок вікна, SQL-запити та імена змінних — лише латиницею. Своє ім'я, прізвище та групу пишіть у транслітерації: Ivan Petrenko, KI-31. Кирилиця допускається тільки в коментарях.

Завдання

Створити файл workspace.py — панель нотаток, які зберігаються між запусками у базі SQLite.

Головна вимога: Нотатки живуть у базі, а не в пам'яті. Після закриття й повторного запуску застосунку всі нотатки мають бути на місці.

Персоналізація

На початку файлу оголосити три константи і використовувати лише їх (не дублювати ці значення в коді):

STUDENT_NAME = "Ivan Petrenko"                # ваше ім'я та прізвище транслітерацією
STUDENT_GROUP = "KI-31"                       # ваша група
DB_FILE = "workspace_ivan_petrenko.db"        # файл бази з вашим прізвищем

База даних

Одна таблиця, створюється при старті:

CREATE TABLE IF NOT EXISTS notes (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    text TEXT NOT NULL,
    created_at TEXT NOT NULL
)

created_at заповнюється в Python: datetime.now().strftime("%Y-%m-%d %H:%M").

Схема розміщення елементів

Кожен прямокутник на схемі — це один віджет, а підпис усередині — ім'я змінної, під яким його треба створити:

+--------------------------------------------------------------------+
|  WorkspacePanel (QWidget)                                          |
+--------------------------------------------------------------------+
|                                                                    |
|  +------------------------+                  +------------------+  |
|  |      title_label       |                  |  counter_label   |  |
|  +------------------------+                  +------------------+  |
|                                                                    |
|  +------------------+  +----------------------------------------+  |
|  |    add_button    |  |               note_field               |  |
|  +------------------+  +----------------------------------------+  |
|  +------------------+                                              |
|  |  delete_button   |  +----------------------------------------+  |
|  +------------------+  |                                        |  |
|  +------------------+  |                                        |  |
|  |   clear_button   |  |             preview_label              |  |
|  +------------------+  |                                        |  |
|                        |                                        |  |
|                        +----------------------------------------+  |
|                                                                    |
|  +----------------------+                          +------------+  |
|  |     status_label     |                          |quit_button |  |
|  +----------------------+                          +------------+  |
|                                                                    |
+--------------------------------------------------------------------+

Порожні місця між лівою та правою групами в шапці й підвалі — це addStretch().

Віджети

Ім'я Тип Що показує
title_label QLabel ім'я і групу з констант: Ivan Petrenko, KI-31
counter_label QLabel кількість нотаток у базі: Notes: 4
add_button QPushButton напис Add — додає нотатку з note_field
delete_button QPushButton напис Delete last — видаляє останню нотатку
clear_button QPushButton напис Clear all — видаляє всі нотатки
note_field QLineEdit поле вводу тексту нової нотатки
preview_label QLabel нотатки з бази, по одній у рядок:
2026-08-19 14:05 read Qt docs
2026-08-19 14:07 finish practice 3
status_label QLabel назву файлу бази: Database: workspace_ivan_petrenko.db
quit_button QPushButton напис Quit, закриває вікно

Поведінка

Старт. Підключитись до бази, створити таблицю, за потреби додати три власні нотатки, після чого відмалювати вміст бази у вікні.

Оновлення вигляду. Зробити один метод refresh(), який:

  1. Читає всі нотатки: SELECT created_at, text FROM notes ORDER BY id.
  2. Формує рядки виду <created_at> <text> і показує їх у preview_label, з'єднавши через "\n". Якщо база порожня — No notes yet.
  3. Оновлює counter_label на Notes: <кількість>.

Цей самий метод викликається після кожної зміни бази — окремої копії нотаток у пам'яті класу тримати не треба.

add_button. Якщо note_field порожнє (перевіряти .strip()) — нічого не робити. Інакше INSERT нового рядка з поточним часом, commit(), очистити note_field і викликати refresh().

delete_button. Видаляє нотатку з найбільшим id:

clear_button. DELETE FROM notes — видаляє всі записи.

Закриття. Перевизначити closeEvent() і закрити підключення:

def closeEvent(self, event):
    self.connection.close()
    super().closeEvent(event)

quit_button викликає self.close() — і closeEvent() спрацює сам.

Параметри запитів

Текст нотатки підставляти тільки через плейсхолдер: cursor.execute("INSERT INTO notes (text, created_at) VALUES (?, ?)", (text, created_at)). Склеювання SQL через f-рядок — помилка, за яку знімаються бали.


Знайшли помилку чи бажаєте додати інформацію, щоб покращити курс? Створіть issue на GitHub