Как сделать графический калькулятор на python
Перейти к содержимому

Как сделать графический калькулятор на python

  • автор:

# Calculator steps — калькулятор по шагам

Для начала создадим минимально необходимый интерфейс:

Задание:

Названия переменных должны быть корректными:

  • существующие английские слова;
  • имя переменной всегда начинается с имени существительного отражающее суть/смысл переменной;
  • соединение двух и/или более слов через нижнее подчеркивание: "button_zero".

Создадим виджет Entry():

  • реализовать отображение нуля;
  • с параметром выравнивания текста по правому краю;
  • виджет должен растягиваться по горизонтали на всю ширину окна.

Создадим виджет Entry():

  • реализовать отображение нуля;
  • с параметром выравнивания текста по правому краю;
  • задать стиль шрифта "Helvetica 30 bold";
  • виджет должен растягиваться по горизонтали на всю ширину окна.

Создадим две кнопки обозначающие "0" и "1".

Рекомендации:

Виждеты Entry() лучше растянуть на несколько колоном с запасом, чтобы не исправлять растяжение каждый раз при добавлении новых кнопок. В данном случае было задано заполнение на 15 колонок.

Создаем только интерфейс, реализация функциональности кнопок на данном этапе не требуется.

# 2. Реализация функциональности двух кнопок

Визуально в интерфейсе измениться лишь заголовок версии калькулятора:

Задание:

Названия функций должны быть корректными:

  • существующие английские слова;
  • название начинается всегда с глагола отражающие суть/смысл функции;
  • соединение двух и/или более слов через нижнее подчеркивание: "click_zero".

Создать и подключить функцию для кнопки "1":

  • функция должна допечатывать цифру "1" в оба поля Entry().
  • реализовать проверку при которой не будет происходить набор цифр на табло вида: "011" и т.п.

Создать и подключить функцию для кнопки "0":

  • функция должна допечатывать цифру "0" в оба поля Entry().
  • реализовать проверку при которой не будет происходить набор цифр на табло вида: "000" и т.п.

Проверить работу кнопок: "0" и "1":

  • правильные цифры вида: 1, 101, 1100 и т.п.
  • неправильные цифры вида: 01, 00, 001 и т.п. набираться не должны.
  • не допустимо выведение ошибок в консоли.

Рекомендации:

На начальном этапе создания для проверки факта вызова функции можно использовать команду: print().

Если функцию для кнопки один написана верно, то функцию для нуля можно, написать скопировав функцию один с минимальными изменениями:

  • изменив имя функции;
  • изменив цифру выводимую на экранах.

Не забудьте изменить версию в заголовке программы на "Calc v.02"

# 3. Clear — добавление кнопки очистки

На следующем шаге добавим кнопку обнуления наших полей:

Задание:

  1. добавить кнопку очистки — "С" и реализовать функцию очистки — обнуления результатов.

# 4. Plus — добавление кнопки плюс

Добавим кнопку плюс и реализуем функциональной кнопки:

Задание:

Названия функций должны быть корректными:

  • существующие английские слова;
  • название начинается всегда с глагола отражающие суть/смысл функции;
  • соединение двух и/или более слов через нижнее подчеркивание: "click_zero".

добавить кнопку плюс — "+" и реализовать функциональность:

  • создать функцию, которая будет допечатывать в виждете выражения, не более одного "+";
  • без реализации вычисления введенного выражения.

доработать функции нуля и единицы. Добавить проверки для корректности набора выражения:

  • допустимые выражения: 1+0+10+11 и т.п.
  • недопустимые выражения: 00++01+001 и т.п.
  • не допустимо выведение ошибок в консоли.

Рекомендации:

Функция плюс только проверяет наличие в конце знака "+":

  • если выражение заканчивается цифрой, то "+" доставляется в конец строки;
  • если выражение заканчивается "+", то стирается "+" в конце исходного выражения, и "+" доставляется в конце строки;

Функции нуля и единицы, лучше дорабатывать добиваясь максимальной идентичности тела функции. На данном шаге различие тел функций можно свести только к разнице доставляемых "0" или "1".

В дальнейшем ещё планируется добавление цифр, поэтому колонка для размещения плюса указана 10.

На данном этапе калькулятор реализует только четыре функции:

  • функция "нажата_очистка";
  • функция "нажата_ноль";
  • функция "нажата_один";
  • функция "нажат_плюс".

# 5. Eval() — вычисляем выражение

Теперь будут вычисления:

Функция eval() — позволяет вычислить значение примера переданного в виде строки:

Задание:

  1. Используя функцию eval(), доработайте функцию плюса:
    • будет браться выражение из верхнего виджета;
    • вычисляться;
    • ответ выводиться в основной цифровой дисплей при нажатии кнопки "+".
    • не допустимо выведение ошибок в консоли.

# 6. Equal — равно

Добавляем кнопку равно:

Задание:

Названия функций и переменных должны быть корректными:

  • существующие английские слова;
  • название функции всегда начинается с глагола отражающие суть/смысл функции;
  • имя переменной всегда начинается с имени существительного отражающее суть/смысл переменной;
  • соединение двух и/или более слов через нижнее подчеркивание: "click_zero".

На основе функции "+" создаем функцию "=" с минимальными изменениями. В идеале они должны отличаться только знаком. При необходимости доработайте обе функции.

Прикрепите функцию "равно" к кнопке "=".

Проверьте корректность работы калькулятора:

  • допустим ввод выражения: 11+10+1= и т.п. и выводом результата в основной цифровой дисплей: 22 и т.п.
  • не допустим ввод выражения: 01++00=+01+= и т.п.
  • не допустимо выведение ошибок в консоли.

На данном этапе калькулятор реализует пять функции:

  • функция "нажата_очистка()";
  • функция "нажата_ноль()";
  • функция "нажата_один()";
  • функция "нажат_плюс()";
  • функция "нажато_равно()".

# 7. Division — деление

Добавляем кнопку деление:

Задание:

Названия функций и переменных должны быть корректными:

  • существующие английские слова;
  • название функции всегда начинается с глагола отражающие суть/смысл функции;
  • имя переменной всегда начинается с имени существительного отражающее суть/смысл переменной;
  • соединение двух и/или более слов через нижнее подчеркивание: "click_zero".

На основе функции "+" или "=" создаем функцию "/" с минимальными изменениями. В идеале они должны отличаться только знаком. При необходимости доработайте функции.

Прикрепите функцию "равно" к кнопке "/".

Проверьте корректность работы калькулятора:

  • допустим ввод выражения: 11+10/1= и т.п. и выводом результата в основной цифровой дисплей: 22 и т.п.
  • не допустим ввод выражения: 01++/00=//01+=10//= и т.п.
  • выведение ошибок в консоли допустимо только при вводе примера с делением на ноль вида: 1/0= и т.п.

На данном этапе калькулятор реализует функции:

  • функция "нажата_очистка()";
  • функция "нажата_ноль()";
  • функция "нажата_один()";
  • функция "нажат_плюс()";
  • функция "нажато_деление()";
  • функция "нажато_равно()".

# 8. Функция "нажато_число(число)" с параметром

Визуальные изменения будут следующие:

Функция с параметром number имеет вид:

Создадим дополнительную пробную программку вида:

Пример печати номера нажатой кнопки может быть следующим:

Результат в зависимости последовательности от нажатия кнопок может быть:

Подобное поведение можно реализовать с помощью функции с параметром и lambda-функции :

Результат поведения будет подобен предыдущему коду:

Задание:

Названия функций и переменных должны быть корректными:

  • существующие английские слова;
  • название функции всегда начинается с глагола отражающие суть/смысл функции;
  • имя переменной всегда начинается с имени существительного отражающее суть/смысл переменной;
  • соединение двух и/или более слов через нижнее подчеркивание: "click_zero".

На основе функции "1" создаем функцию с параметром, например: click_number(number). В том месте где явно выводили "1" на печать, заменяем параметром number

Заменяем в кнопках "0" и "1" вызов функции на функцию с параметром добавив в скобках вызова нужное число.

Комментируем функции: "нажата_ноль()" и "нажата_один()"

Проверяем правильность работы калькулятора. Появление ошибок в консоли допустимо только при вводе примера с делением на ноль вида: 1/0= и т.п.

Добавляем кнопку "2" и подключаем к функцию с параметром.

Проверяем ещё раз. Работа нарушаться не должна.

Если все работает верно. Удаляем закомментированный ранее код.

На данном этапе калькулятор реализует функции:

  • функция "нажата_очистка()";
  • функция "нажата_цифра(цифра)";
  • функция "нажат_плюс()";
  • функция "нажато_деление()";
  • функция "нажато_равно()".

# 9. Функция "нажат_знак(знак)" с параметром

Визуальные изменения будут следующие:

Задание:

Названия функций и переменных должны быть корректными:

  • существующие английские слова;
  • название функции всегда начинается с глагола отражающие суть/смысл функции;
  • имя переменной всегда начинается с имени существительного отражающее суть/смысл переменной;
  • соединение двух и/или более слов через нижнее подчеркивание: "click_zero".

На основе функции "+" создаем функцию с параметром, например: click_sign(sign). В том месте где явно выводили "+" на печать, заменяем параметром sing .

Заменяем в кнопках "+" и "/" вызов функции на функцию с параметром добавив в скобках вызова нужный символ.

Комментируем функции: "нажат_плюс()" и "нажато_деление()"

Проверяем правильность работы калькулятора. Появление ошибок в консоли допустимо, за исключением примера с делением на ноль вида: 1/0= и т.п.

Исправляем кнопку "=" и подключаем к функцию с параметром.

Проверяем ещё раз. Работа нарушаться не должна.

Если все работает верно. Удаляем закомментированный ранее код.

На данном этапе калькулятор реализует функции:

  • функция "нажата_очистка()";
  • функция "нажата_цифра(цифра)";
  • функция "нажат_знак(знак)".

# 10. Проверка деления на ноль

Задание:

Проверку необходимо реализовывать только для строки кода в которой возможно возникновение ошибки, т.е. для единственной строки где вызывается функция eval() .

Реализовать проверку, используя конструкцию: try-except . При делении на ноль можно выводить надпись на цифровом экране: "Cannot divide by zero".

Доработать функцию нажатия цифр, что бы после выведения ошибки деления на ноль можно было корректно проводить новые вычисления.

Тип отлавливаемой ошибки лучше указывать явно. В случае "деления на ноль" — это пит ошибки ZeroDivisionError .

Проверяем правильность работы калькулятора:

  • недопустимые выражения: Cannot divide by zero0, Cannot divide by zero+ и т.п.
  • не допустимо выведение ошибок в консоли.

Рекомендации:

  1. Реализовать проверку "деления на ноль" используя конструкцию if. else , вместо try-except .

На данном этапе калькулятор реализует функции:

  • функция "нажата_очистка()";
  • функция "нажата_цифра(цифра)";
  • функция "нажат_знак(знак)".

# 11. Генерация кнопок с числами

Создадим дополнительную пробную программку вида:

Используя цикл и подключенную lambda-функции получим следующий код:

При нажатии кнопок по порядку в консоль выводиться только "4". Переменная i — динамическая, и цикле изменяет свое значение с 0 до 4. После генерации всех кнопок последнее значение i=4, поэтому после запуска программы, при нажатии на любые сгенерированные кнопки в консоль выводятся только "4":

Для внутреннего сохранения (связывания) значения i момент генерации определенной кнопки, используется lambda-функция с параметром:

Результат нажатия кнопок по порядку:

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

Задание:

Сгенерировать кнопки используя "лямбда-функцию" с параметром.

Проверяем правильность работы калькулятора:

  • выражение и числа должны вводиться и выводиться корректно.
  • появление ошибок в консоли допустимо.

# 12. Генерация кнопок с математическими знаками

Добавим ряд кнопок со знаками:

Задание:

Сгенерировать базовых математических операций: "+", "-", "*", "/", используя "лямбда-функцию" с параметром.

Реализовать функциональность кнопок, внесите необходимые изменения в функции нажатия цифровых кнопок и кнопок математических операций.

Проверяем правильность работы калькулятора:

  • выражение и числа должны вводиться и выводиться корректно.
  • появление ошибок в консоли допустимо.

# 13. Дальнейше развитие

Задание:

Добавить кнопку "." и реализовать её функциональность.

Добавить кнопку стирания последней набранной цифры.

Добавить генерацию кнопок расширенных математических операций. Реализовать функциональность кнопок.

Добавить привязку нажатие клавиш на клавиатуре к соответствующим кнопкам калькулятора.

Реализовать полную генерацию разных интерфейсов на массива.

Создать свою функцию вычисления примеров в замен функции eval().

Рекомендации:

Для кнопки "." лучше использовать функцию чисел.

Полную генерацию кнопок интерфейса можно реализовать передав кнопки в виде двумерного массива.

Полностью реализуйте функциональность калькулятора. Программа должна стать законченным проектом.

Пишем десктоп-приложение на Python с помощью Tkinter

Знакомимся с библиотекой Tkinter — пишем на Python кросс-платформенный калькулятор, который рассчитывает вес человека.

Иллюстрация: Merry Mary для Skillbox Media

Антон Яценко

Десктопные приложения пишут на разных языках программирования: C++, C#, C, Python и других. Начинающим разработчикам проще всего использовать Python и его библиотеки для работы над графическими интерфейсами.

Одна из таких библиотек — Tkinter. Она входит в стандартный пакет Python и позволяет создавать приложения для Windows, mac OS и Linux. Давайте разберёмся, как устроена эта библиотека, и напишем десктопный калькулятор, помогающий рассчитать вес человека.

Что такое GUI и как с ним работать в Python

GUI (Graphical User Interface) — это графический интерфейс пользователя, оболочка программы, с которой мы взаимодействуем с помощью клавиатуры и мыши. На современных операционных системах почти все программы работают с графическим интерфейсом, и мы каждый день сталкиваемся с GUI: читаем статьи в браузере, набираем текст в редакторе или играем в игры.

Противоположность графическому интерфейсу — командная строка, позволяющая управлять приложением с помощью текстовых команд. Такой интерфейс реализован в терминале macOS и командной строке Windows.

Для работы с GUI в Python есть четыре библиотеки:

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

Знакомимся с Tkinter

Tkinter — это удобный интерфейс для работы со средствами Tk. Приложения, созданные на основе этой библиотеки, кросс-платформенные, то есть могут запускаться на разных операционных системах.

Схематично работу с Tkinter можно представить в виде четырёх шагов:

Что здесь происходит:

  • Мы подключаем библиотеку Tkinter с помощью директивы import.
  • Создаём главное окно приложения, в котором будут размещаться все графические элементы.
  • Добавляем виджеты — визуальные элементы, выполняющие определённые действия.
  • Создаём главный цикл событий — он включает в себя все события, происходящие при взаимодействии пользователя с интерфейсом.

Ключевые объекты в работе с Tkinter — виджеты. Это аналоги тегов из HTML, которые позволяют создавать интерактивные и неинтерактивные элементы, например надписи или кнопки. Всего их 18, но чаще всего используют следующие:

  • Button — кнопки;
  • Canvas — «холст», на котором рисуют графические фигуры;
  • Entry — виджет для создания полей ввода;
  • Label — контейнер для размещения текста или изображения;
  • Menu — виджет для создания пунктов меню.

Понять работу с виджетами легче всего на практике. Но прежде чем к ней приступить, обсудим идею нашего первого десктопного приложения.

Создаём калькулятор для расчёта индекса массы тела

Мы напишем калькулятор индекса массы тела. ИМТ — это важный медицинский показатель, который позволяет оценить, есть ли у человека избыточный вес или ожирение. Он рассчитывается по следующей формуле: ​​

ИМТ = вес (в кг) / рост 2 (в метрах)

Результаты расчётов оценивают с помощью специальной таблицы. У врачей она имеет много градаций, мы же воспользуемся упрощённой версией:

Шаг 1

Запускаем Python и импортируем Tkinter

Писать код на Python лучше всего в специальной IDE, например в PyCharm или Visual Studio Code. Они подсвечивают синтаксис и предлагают продолжение кода — это сильно упрощает работу программиста. Весь код из этой статьи мы писали в Visual Studio Code.

Библиотека Tkinter предустановлена в Python. Поэтому её нужно только импортировать:

Теперь мы можем использовать любые модули из этой библиотеки.

Шаг 2

Делаем эскиз интерфейса и продумываем логику приложения

Прежде чем писать код, необходимо ответить на несколько вопросов:

  • Какие данные мы хотим получить от пользователя и в каком виде?
  • Какое событие будет запускать расчёт ИМТ: нажатие кнопки, получение приложением всех необходимых данных или что-то другое?
  • Как будем показывать результат?

В нашем случае необходимо получить от пользователя вес и рост в виде целых чисел. При этом вес должен быть введён в килограммах, а рост — в сантиметрах. ИМТ будет рассчитываться по нажатии кнопки, а результат — выводиться во всплывающем окне в виде значения ИМТ и категории, к которой он относится.

Схематично графический интерфейс нашего калькулятора будет выглядеть так:

Теперь попробуем реализовать интерфейс и работу калькулятора с помощью Python и Tkinter.

Шаг 3

Создаём основное окно и указываем название приложения

После импорта библиотеки в Python загрузим её методы:

Первая строка позволяет нам загрузить все методы Tkinter и использовать их в коде без ссылки на их наименование. Второй строкой мы явно импортируем метод messagebox, который будем использовать для вывода всплывающего окна с результатом. Это удобно, так как метод потребуется нам несколько раз.

Теперь создадим окно нашего приложения. Для этого воспользуемся модулем Tk. Приложение назовём «Калькулятор индекса массы тела (ИМТ)»:

После запуска кода ничего не произойдёт. Это не ошибка. На самом деле код выполнился и окно закрылось. Необходимо явно указать, что окно приложения не должно закрываться до тех пор, пока пользователь сам не сделает этого. Для этого к коду добавим функцию window.mainloop (), указывающую на запуск цикла событий:

Запустив код, увидим экран приложения:

Мы не указали размер окна, поэтому название приложения не помещается в него полностью. Исправим это с помощью метода geometry:

Теперь название приложения видно полностью:

Шаг 4

Создаём виджет Frame для контроля за расположением элементов

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

  • pack — используется, когда мы работаем с контейнерами для элементов. Позволяет позиционировать кнопки, надписи или другие элементы внутри контейнеров.
  • place — позволяет позиционировать элементы, указывая точные координаты.
  • grid — размещает элементы по ячейкам условной сетки, разделяющей окно приложения.

Мы воспользуемся комбинацией методов pack и grid. Для начала создадим виджет Frame для размещения надписей, полей ввода и кнопок. Подробное описание работы виджета есть в документации. Мы же используем только два свойства: padx и pady.

Обозначим отступы по вертикали и горизонтали в 10 пикселей для элементов, которые будут расположены внутри Frame:

Шаг 5

Добавляем поля ввода информации и кнопку запуска расчёта индекса массы тела

В окне приложения нам необходимо добавить три вида виджетов: поле для ввода информации (Entry), текстовые надписи (Label) и кнопку (Button).

Начнём с надписей. Воспользуемся виджетом Label:

Мы передаём виджету Label два параметра:

  • frame — используем заготовку виджета Frame, в которой уже настроены отступы по вертикали и горизонтали.
  • text — текст, который должен быть выведен на экран.

Для позиционирования виджета используем метод grid. Укажем, что текст должен располагаться в ячейке с координатами «3-я строка, 1-й столбец». Если запустим код, то увидим там единственный элемент:

Сейчас элемент расположен в центре окна, но он займёт правильное положение, когда мы напишем другие элементы.

Добавим вторую надпись о весе аналогичным образом, но при позиционировании в grid укажем следующую, четвёртую строку:

Запускаем код и смотрим на результат:

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

Для позиционирования мы также воспользовались методом grid. Обратите внимание, что наш элемент должен быть расположен напротив надписи «Введите свой рост (в см)». Поэтому мы используем ячейку в той же строке, но уже во втором столбце. Запустим код и посмотрим на результат:

Всё получилось. Остаётся по аналогии добавить поле ввода веса:

Посмотрим на результат:

Теперь добавим кнопку, которая будет запускать расчёт ИМТ. Сделаем это с помощью виджета Button:

Посмотрим на результат:

Теперь в приложении есть все графические элементы. Остаётся лишь написать код, который будет получать информацию из виджетов Entry и рассчитывать индекс массы тела.

Шаг 6

Получаем информацию из виджетов Entry и рассчитываем индекс массы тела

Напишем простую функцию и разберём её построчно:

Функция готова. Но теперь нам необходимо оценить полученный результат расчёта и вывести сообщение для пользователя.

Шаг 7

Оцениваем результат и показываем пользователю

Дополним нашу функцию calculate_bmi. Воспользуемся условным оператором if, чтобы учесть полученные значения ИМТ, и методом Tkinter messagebox для отображения сообщения во всплывающем окне:

Остаётся последний шаг — наша функция должна запускаться при нажатии на кнопку «Рассчитать ИМТ». Для этого добавим свойство command в виджет Button:

Запустим код и посмотрим на результат:

Всё работает. Функция получает данные из полей ввода и рассчитывает индекс массы тела, показывая результат на экране.

Приведём код полностью без комментариев

Что дальше?

Узнать о возможностях Tkinter и особенностях работы с виджетами можно в официальной документации. А если хотите найти больше реальных примеров для практики, советуем две книги:

GUI Калькулятор на Python tkinter

Статьи

Введение

В ходе статьи напишем GUI калькулятор на языке программирования Python с использованием модуля tkinter.

Написание GUI калькулятора

Для начала импортируем библиотеку tkinter:

Создадим объект класса Tk(), укажем разрешение окна 268×288, заголовок “Калькулятор” и запретим возможность изменять разрешение окна:

Создадим виджет Frame() и отобразим его методом grid():

Добавим текстовое поле (виджет Entry()) на фрейм, укажем шрифт Arial 15 размера жирного начертания, толщину 24 и запретим возможность писать в нём. Отобразим его методом pack():

Далее создадим кортеж, в котором будут храниться кнопки будущего калькулятора:

Создадим пустую переменную expression строкового типа данных. Она нам пригодится для избежания ошибок в будущем. Также добавим кнопку, которая в последующем
будет служить для очищения текстового поля:

Теперь добавим основные кнопки калькулятора с помощью цикла. И в основном, и во вложенном циклах будет по 4 итерации. Во вложенном цикле создаётся кнопка, с шириной 2, и высотой 3. Текстом будет являться поиндексное значение из кортежа buttons. Команда будет задаваться с помощью анонимной функции lambda, позиционироваться кнопки будут с помощью метода grid():

Создадим функцию btn_click(), и в качестве аргумента укажем item. Сделаем переменную expression глобальной, после чего добавим конструкцию try … except:

В try мы даём возможность писать в текстовое поле, приведя параметр state в normal. Далее к expression прибавляем item. И вводим результат в текстовое поле:

Зададим условие, что если на;ата кнопка “равно”, то будет подсчитываться результат методом eval(). После чего результат будет выведен в текстовое поле, а expression обнулится. В конце try снова замораживаем текстовое поле:

В except мы будем ловить ошибку ZeroDivisionError, и говорить, что деление на 0 запрещено.
Также добавим ошибку синтаксиса, при которой будет просто выводиться слово “Ошибка”:

Теперь добавим функцию для очищения текстового поля. Внутри неё делаем переменную expression глобальной, опять же размораживаем текстовое поле, очищаем его, и снова замораживаем:

GUI Калькулятор на Python tkinter

Заключение

В ходе статьи мы с Вами написали код для GUI калькулятора на языке программирования Python с использованием модуля tkinter. Надеюсь Вам понравилась статья, желаю удачи и успехов! ��

Coming Soon!

This is going to be another great website hosted by PythonAnywhere.

PythonAnywhere lets you host, run, and code Python in the cloud. Our free plan gives you access to machines with everything already set up for you. You can develop and host your website or any other code directly from your browser without having to install software or manage your own server.

Need more power? Upgraded plans start at $5/month.

Developer info

Hi! If this is your PythonAnywhere-hosted site, then you’re almost there — you just need to create a web app to handle this domain.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *