Содержание котенка (часть 2 - back-end)
На предыдущем уроке мы создавали интерфейс - своего рода «фронтэнд». Далее мы запрограммируем поведение программы при нажатии на кнопки: обработку событий кнопок - эту «теневую» сторону программы скрытую от глаз пользователя называют «бэкэнд».
Планирование проекта
Перед тем чтобы что-то начинать делать важно расположить задачу на шаги, и чем подробней и мельче шаг будет получен, тем легче, проще и быстрей их будет реализовать:
- требуется обработать событие нажатие кнопки;
- обработка события включает в себя команду вызова события и функцию которая вызывается;
- нужно понимать, что каждое окошко в каждой строчке служит для ввода данных;
- вводимые данные необходимо считать (взять из поля) и хранить их;
- необходимо создать переменные, в которых будут храниться вводимые данные, для каждого поля отдельно;
- обработка значений переменных;
- вывод результатов в соответствующие поля.
Обработка нажатия кнопки
При нажатии на кнопку программы в программе происходит вызов события. Имя вызываемого события которое будет являться именем вызываемой функции выбирается произвольно, но с учетом правил именования переменных в языках программирования. Кроме этого имена функций часто начинаются со слов:
set
- если функция получает и записывает данные в переменную;get
- если функция выводит данные.
Код функции обязательно необходимо размещать перед тем как его будут вызывать, т.е. если функция вызывается в строке 15, то написана вызываемая функция должна быть выше, например в строке 10. Для понятности кода порядок написания программы бывает следующий:
- импорт библиотек
- объявление всех глобальных переменных
- создание и описание всех функций
- основное тело программы
- в сложных проектах: последняя строка - это строка запуска программы.
Функция будет получать данные полей одной строки, поэтому мы назовем функцию: set_first()
. Добавьте код функции, в соответствующее место кода программы:
def set_first():
print("Called the first function!")
2
Результат выполнения, кода будет прежним: окно программы:
При нажатии на любую из кнопок ничего не происходит, потому что мы не вписали код обработчика события: нажмите на кнопку. Команда обработчика событий: command=set_first. Т.е. необходимо изменить строку создания кнопки таким образом:
button_1 = Button(text="=", command=set_first)
button_1.grid(column=4, row=1)
2
Запустив код программы, запуститься то же окно, но при нажатии на кнопку в первой строке, в консоли будет выводиться сообщение:
Called the first function!
Теперь создайте функцию и обработчик события для второй кнопки. Измените во второй функции надпись выводимую в консоль на «Called the second event». Проверьте правильность работу второй кнопки. Если все работает верно и понятно. Добавьте обработчики событий для всех оставшихся кнопок.
Хранение, ввод и вывод данных окна
Для сохранения данных заданных в одно из полей нужно сначала создать переменную в которой их хранить. Создадим переменную для второго поля первой строки, дав ей соответствующее название. И присвоим значение переменной равной 5:
num12 = StringVar()
num12.set(5)
2
Для того чтобы связать поле ввода данных с этой переменной внесем изменения в код в строке:
entry_12 = Entry(textvariable=num12)
entry_12.grid(column=1, row=1)
2
В результате выполнения во втором поле первой строки будет выведена цифра «5»:
Создайте переменный для третьего и четвертого полей первой строки и присвойте им значения 3 и 4. Визуализация окна должна получиться следующей:
Считывание данных из полей, будет происходить при нажатии на кнопку. Для получения данных из поля нужно написать следующую команду: num12.get() Изменим код вызываемой функции:
def set_first():
print("Called the first function!")
print(num12.get())
2
3
В результате запуска, приложения при нажатии на кнопку в консоли будет выведены надпись и число:
Called the first function!
5
2
Выведите данные в консоль третьего и четвертого текстового поля доработав код соответствующим образом.
Обработка значений переменных
Последнее поле в строке программы будет выводить результат вычисления предыдущих полей. Для начала создадим переменную в которой будем хранить данные для последнего поля первой строки и присвоим значение равное «0»:
total_first = StringVar()
total_first.set(0)
2
И привяжем переменную к полю:
entry_15 = Entry(textvariable=total_first)
entry_15.grid(column=5, row=1)
2
Для получения значения общей цены затрат надень рассчитывается по формуле:
количество единиц * цена за единицу товара / количество дней = общая цена в день
Все преобразования и выведения результата вносим в функцию обработки события нажатия на кнопку первой строки для последнего первой строки:
def set_first():
print("Called the first function!")
print(num12.get())
total_first.set(float(num12.get())*float(num13.get())/float(num14.get()))
2
3
4
5
Значения из текстовых полей, передаются в виде строки, поэтому для вычисления с ними данные необходимо преобразовать в число. Функция float(…)
преобразует строку в число с плавающей запятой.
Теперь при запуске программы и нажатии кнопки в последнем поле должно появиться вычисленное значение:
По аналогии доделайте три строки программы.
ПРИМЕЧАНИЕ
Всего затраты за год высчитываются по формуле: (общая цена первой строки + общая цена второй строки + общая цена третьей строки) * 365 = всего за год
И вычисляются при нажатии на соответствующую кнопку равно.
Количество лет - это поле не вычисляемое, а поле ввода длительность жизни котенка.😉 И при нажатии кнопки «Итого» выводиться результат всех затрат, вычисляем по формуле:
TIP
всего затраты за год * количество лет = общее содержание за все годы
Результат программы может быть следующим: