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

от admin

# 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. Генерация кнопок с математическими знаками

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

Читать:
System ninja что это за программа

Задание:

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

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

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

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

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

Задание:

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

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

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

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

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

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

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

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

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

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

Mini Project: GUI Calculator using Python3 and tkinter

By the end of this reading, you would be able to code for a fully -functional Calculator that has all functionalities of a Calculator present on the side frame in macOS.

We are going to develop a Graphical User Interface version of the calculator using Python3 and the most famous GUI library tkinter. tkinter is Python’s de-facto standard GUI and is included with the standard installs of Python3.

You can access the complete code here on GitHub

saiankit/calculator-app-tkinter

This is the GUI version of calculator app written using Tkinter library in Python. — saiankit/calculator-app-tkinter

We shall discuss the process in three parts which are properly demarcated :

Part #1: Prepare the application’s main window and get the app running

Import tkinter module into workspace and math module for using the SquareRoot function.

Instantiate the Tk() class that provides us the ability to utilize the functionality of tkinter in our application.

Start the application’s main loop, waiting for mouse and keyboard events.

Code at the end of Step #1:

After running the above python code snippet you will end up having a window open with the title ‘Calculator App’

Part #2: Building the calculator’s skeleton with no functionality

  • The mathematical expressions [numbers (or) operators] clicked by buttons would be visible on the answerEntryLabel.
  • The final answer on click of the “=” button after evaluating the expression would be visible on the answerFinalLabel.
  • AC ( All Clear ) button on click clears out the current data and prepares the calculator to start a new calculation.
  • The corresponding row and column numbers have been depicted in the wireframe to clearly understand the placement of buttons and labels in our App.

Creating our Labels and the variables.

We can hardcode all the buttons but that doesn't actually prove a software developer’s niche towards development. So we are going to DRY (Don’t Repeat Yourself) our code by finding some relationship between widgets.

The buttons in rows 2,3,4,5 and columns 0,1,2,3 are following a similar pattern of placement of the buttons. We will also create some blank buttons for the last row except the ‘.’ button.

We define a function that creates a button and the command that occurs when the button is clicked is changeAnswerEntryLabel( ) which we shall code for later in the reading.

We will hardcode all the other buttons because either they have different commands or have different placements in the grid.

Running the above script would obviously give you an error because all the commands on click of buttons are not yet declared, but actually, this creates the main skeleton of the application.

Part #3: Adding the functionality to the calculator app

To store the expression we are entering with the help of buttons that should also be printed on the answerEntryLabel is stored in a global string variable. Let us also create another global string variable whose use will be discussed later.

Let us create the function changeAnswerEntryLabel( ) that appends the entry by buttons to answerEntryLabel on the click.

Let us create the function allClear() that works on click on the “AC” button.

Let us create the function clearAnswerEntryLabel. We shall use this function later called to clear answerEntryLabel and also clear answerVariableGlobal. We have created the answerLabelForSquareRoot because once the “=” button is clicked the value in the answerVariableGlobal is evaluated and cleared using this function but answerLabelForSquareRoot shouldn’t be erased and contain the expression so that we can evaluate the SquareRoot of the answer when “√” is clicked.

Let us create the main function “evaluateAnswer( )” that evaluates the expression present in the answerVariableGlobal and returns the value to answerFinalLabel also clearing the answerEntryLabel using clearAnswerEntryLabel( )

Let us create the final function evaluateSquareRoot( ) that evaluates the expression present in the answerLabelForSquareRoot for the square root of that value and returns that value to answerFinalLabel.

The complete final code by assembling all the three parts we get :

Looks Easy !! Isn’t it?

This is how you can develop a Mini Project using Python3.

A video on how to code for this Mini Project is streaming on my YouTube Channel: Code Studio Sai Ankit. Do follow and stay tuned for much more interesting stuff on Software Development.

Калькулятор с графическим интерфейсом с помощью tkinter

Сначало всё по стандарту. Импортируем библиотеки. Использовать мы будем сам tkinter и библиотеку математических функций math.

Далее задаем функции кнопок.(Я пару шагов пропустил, точнее написал после, но калькулятор от этого не сломается.):

Теперь создаём окно, в котором будет наш пример и ответ.

Если посмотреть на оригинальный калькулятор Виндовс мы увидим, что текст располагается с правой стороны, сделаем также. Для этого в ткинтер используется функция justify :

Следующий шаг прост. Располагаем кнопки.

В моей задаче было использование картинки в качестве корня, поэтому используем PhotoImage для импортировки фотографии(фотография должна быть в одной папке с кодом)

Последние шаги по мелочам. В качестве дополнительной функции добавим модуль. Кнопку очистки всего и равно добавляем обязательно!

Калькулятор

Многие программисты стараются изучать языки программирования с помощью написания достаточно простых программ. Один из вариантов – написание калькулятора. Конечно, можно посчитать в отладчике Python или запустив консоль. Но гораздо лучше написать на python свой калькулятор с графическим интерфейсом.

Считаем в консоле

Чтобы посчитать математические выражения можно запустить консоль. Запустить python. После этого набираем математические выражения и получаем ответ. Для этого даже не надо уметь программировать.

Делаем простой калькулятор

Лучше всего закреплять свои знания по программированию с помощью написания простых программ. Таких приложений можно придумать много – календарь, программа для хранения заметок, получение прогноза погоды.

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

В нашем случае мы разберем, как создать простой графический калькулятор на Python 3. Для реализации графического интерфейса воспользуемся стандартным пакетом Tkinter. Он входит в состав Python 3. Соответственно, если у вас установлен Python, то дополнительно не надо ничего устанавливать.

В первых строках файла calculator.py подключаем библиотечные функции:

  • Tkinter для графического интерфейса;
  • Decimal для вычислений с большей точность, так как точности float не достаточно.

Импорт библиотек и исходные данные

Создаем окно приложения — объект Tk с заголовком Calculator. Во вложенном кортеже buttons будут храниться обозначения для кнопок. В список stack будем добавлять введенные числа и операции, которые надо совершить. activeStr предназначен для хранения набираемого числа.

Вычисление результата

Функция calculate получает из списка stack операнды и операцию которую над ними надо произвести. Результат отображается в надписи label. Получать из списка строки будем с помощью метода pop.

Обработка нажатия

В функции click выполняется обработка нажатой клавиши. В качестве ее аргумента передается текст, отображаемый на кнопке, которую нажали. Хотелось бы хранить вводимое значение прямо в надписи, а не создавать для этого отдельную переменную. Но так не получается из-за алгоритма работы. После того как посчитан результат, он записывается в надписи. При попытке после этого начать вводить новое число, оно бы дописывало прежний результат.

В списке с операторами и командами для калькулятора не обязательно их будет 3. Но при обработке с помощью метода pop, будут рассматриваться 3 последних введенных значения. А после проведения расчета список очистится. Далее в него добавляется полученный результат, на случай если пользователь нажмет на калькуляторе клавишу операции сразу, а не будет вводить новое число.

Внешний вид

Теперь займемся оформлением внешнего вида калькулятора и зададим обработку нажатия кнопок. Создаем надпись для вывода набираемых значений и результатов. В цикле создаем кнопки. Расположение кнопок и надписи осуществляется в табличном виде с помощью упаковщика grid. И в завершении запускаем цикл обработки событий mainloop.

У надписи выставлена ширина 35, для того, чтобы оформление кнопок подстраивалось под надпись. И в результате кнопки при этом значении лучше выглядят.

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

По аналогии приведенного кода python калькулятора можно сдель, допустим, календарь. Для этого надо будет запрашивать текущую дату у операционной системы. Открывать нужный месяц, рассчитывать какие числа выпадут на понедельники, какой год високосный. Сделать возможность менять год и месяцы.

Похожие статьи