🐍 Python, Tkinter и SQL: разрабатываем приложение для создания словарей и запоминания иностранных слов
Изучаем Tkinter и основные SQL-команды в ходе разработки программы WordMatch с графическим интерфейсом и CRUD-модулем для удобного создания и редактирования пользовательских словарей.
Обзор проекта
Приложение WordMatch включает в себя три модуля, которые могут работать и вместе, и по отдельности:
Скрипт для создания пользовательского словаря.
GUI интерфейс и набор CRUD операций для добавления, редактирования и удаления записей в словаре.
GUI интерфейс и скрипт для проверки правильности сопоставления иностранных слов и значений, выведенных в случайном порядке.
Что мы изучим
Как создавать базы данных, выполнять CRUD операции и запросы на языке SQL.
Как обрабатывать события в элементах Listbox.
Как назначить действия основным кнопкам программы и кнопке закрытия окна.
Скрипт для создания словаря
Словарь представляет собой базу данных SQLite, которая поставляется с Python по умолчанию. Для создания новой базы не придется устанавливать никакие дополнительные модули. Однако при желании можно установить набор дополнительных инструментов для работы с SQLite и один из визуальных браузеров-редакторов:
Структура таблицы словаря dictionary задается в sql_create_dictionary_table скрипта create_new_db.py:
id – порядковый номер записи (целое число);
word– иностранное слово (текстовое поле);
meaning – значение слова на русском языке (текстовое поле).
При желании в этом описании можно задать поле для фонетической транскрипции. Для создания базы в определенной директории надо сначала убедиться, что необходимый путь к папке уже имеется на диске. Если нужную директорию не создать заранее, но указать путь к ней в коде, то выполнение скрипта завершится так:
Если же путь вообще не указан, файл базы данных будет создан в текущей рабочей директории – в Windows это C:\Users\User.
При подключении к несуществующей базе SQLite создает файл базы автоматически, но только при условии, что указанный путь существует. Ниже приведен полный код скрипта для создания базы данных словаря. При этом папка Dictionary в поддиректории Users была создана заранее, а файл dictionary.db в ней был сгенерирован скриптом автоматически:
Графический интерфейс программы включает стандартные элементы Tkinter и несколько виджетов модуля Ttk. Для позиционирования элементов на поверхности окна в Tkinter есть целых три метода – pack(), place() и grid(). Мы воспользуемся последним, поскольку он предусматривает максимальную точность размещения. При использовании grid() все пространство окна делится на ряды row и столбцы column. Для каждого элемента нужно указать ряд и столбец, на пересечении которых он размещается:
Еще можно указать ширину элемента, если нужно, чтобы он соответствовал ширине нескольких столбцов:
SQL-запросы и команды
Первый запрос, который нам потребуется для извлечения из базы всех слов, выглядит так:
В этом случае результаты будут упорядочены по алфавитному порядку английских слов. Если заменить word на meaning, слова в таблице окажутся упорядоченными по русскоязычному значению.
В функции add_word() используется команда для вставки новой записи:
Вопросительными знаками обозначаются параметры, которые передаются (из соответствующих полей формы) на следующей строке:
Для удаления слова необходимо выделить соответствующую строку. Слово извлекается из выделенной строки:
И передается в качестве параметра с командой удаления:
В функции редактирования существующей записи мы реализуем предварительное заполнение поля формы старыми значениями – оригиналом слова и его переводом:
Это нужно для того, чтобы при сохранении записи не сохранилось пустое поле вместо предыдущего слова или значения, если одно из них не нужно было редактировать и пользователь не ввел слово (значение) вручную. А еще это упрощает исправление опечаток.
Фактическое обновление существующей записи производится командой со следующими параметрами:
Английские слова и их значения загружаются в два элемента Listbox. Для перемешивания слов и значений в случайном порядке используется метод shuffle из модуля random. Для обработки событий (кликов) по спискам Listbox мы напишем две функции – callback_left и callback_right. Чтобы связать функции с Listbox, нужно воспользоваться методом bind:
Функция callback_left отслеживает клики по английским словам в левом элементе Listbox. Когда пользователь кликает по слову, функция посылает запрос в базу:
Результат запроса – отдельная запись:
Второй элемент записи record[2] является значением слова, которое передается в функцию callback_right.
Функция callback_right обрабатывает клики по значениям слов в правом списке Listbox. Когда пользователь кликает по значению, функция сравнивает его со значением, полученным из callback_left. Если они совпадают – ответ является верным, и английское слово вместе с соответствующим значением удаляются из левого и правого списков:
В противном случае выводится сообщение о неверном ответе, а выделение с ошибочного значения снимается.
В GUI модуля для заучивания слов доступны две кнопки: Редактировать для вызова скрипта и визуального интерфейса редактирования словаря, а также Начать сначала для перезагрузки слов и значений. Чтобы вызвать скрипт редактирования словаря, достаточно написать простейшую функцию:
Назначение команд для кнопок выглядит так:
Действие для кнопки х, которая по умолчанию просто закрывает окно и останавливает программу, можно переопределить таким образом, чтобы выводилось окно подтверждения:
Для этого нужно задать новый протокол:
И добавить функцию:
Это полный код модуляword_match.py для запоминания и проверки значений слов:
Комментарии