Простой калькулятор на Python с Tkinter

Python предоставляет множество инструментов для задач анализа данных, веб‑ и Android‑разработки. Одним из простых и быстрых инструментов для создания графического интерфейса на Python является Tkinter. Библиотека Tkinter даёт базовые виджеты GUI, которые помогают создавать удобные приложения. Tkinter лёгкий, прост в использовании и обычно уже входит в стандартную поставку Python — установка чаще всего не требуется.
Ниже предполагается, что вы знакомы с основами Python и готовы работать с пакетами и функциями. Если вы впервые работаете с GUI, пройдите короткое знакомство с терминами: Entry — поле ввода строки, Button — кнопка, grid — менеджер компоновки для сетки.
Коротко о Tkinter
Tkinter — это обёртка вокруг библиотеки Tcl/Tk. Она даёт быстрый путь к созданию настольных приложений, обучающих примеров и простых инструментов. Для более сложных, кроссплатформенных или стилистически насыщенных интерфейсов чаще используют PyQt, Kivy или другие фреймворки (см. раздел «Альтернативные подходы»).
Базовая настройка приложения
1. Импорт модуля
Первый шаг — импортировать модуль. В исходном примере используется конструкция для доступа к виджетам и объекту окна.
import tkinter as ttk Примечание: в официальных примерах часто применяют import tkinter as tk и from tkinter import ttk для разделения пространства имён. Оставляем исходный блок кода без изменений (далее добавлен пример с рекомендуемой практикой).
2. Создание переменной окна
Чтобы создать окно, нужно создать объект окна, задать заголовок и размеры (geometry задаёт ширину и высоту в пикселях).
win = ttk.Tk()
win.title('Simple Calculator')
win.geometry('500x500')
3. Главный цикл интерфейса
Метод mainloop() запускает окно и удерживает приложение в рабочем состоянии до закрытия пользователем.
win.mainloop()
Важно: эти три шага — минимум для любого Tkinter‑приложения: импорт, создание корня и запуск цикла событий.
Построение интерфейса
Tkinter предоставляет множество виджетов. В проекте используются кнопки и поле ввода (Entry). Для простого калькулятора понадобятся кнопки 0–9, +, -, x, /, очистка, удаление и вычисление.
В исходном материале размещение кнопок сделали через grid, пример кода ниже сохранён без изменений:
oneButton = ttk.Button(win, text="1", pady=10, padx=20, font = "Serif 15",bg = "black", fg = "white", command=lambda: addToEq(1))
oneButton.grid(row=2, column=0,padx=2, pady=3)
twoButton = ttk.Button(win, text="2", pady=10, padx=20, font = "Serif 15",bg = "black", fg = "white", command=lambda: addToEq(2))
twoButton.grid(row=2, column=1, padx=2, pady=3)
threeButton = ttk.Button(win, text="3", pady=10, padx=20, font = "Serif 15",bg = "black", fg = "white", command=lambda: addToEq(3))
threeButton.grid(row=2, column=2, padx=2, pady=3)
plusButton = ttk.Button(win, text="+", pady=10, padx=20, font = "Serif 15",bg = "black", fg = "white", command=lambda: addToEq("+"))
plusButton.grid(row=2, column=3, padx=2, pady=3)
# div 2
fourButton = ttk.Button(win, text="4", pady=10, padx=20, font = "Serif 15",bg = "black", fg = "white", command=lambda: addToEq(4))
fourButton.grid(row=3, column=0, padx=2, pady=3)
fiveButton = ttk.Button(win, text="5", pady=10, padx=20, font = "Serif 15",bg = "black", fg = "white", command=lambda: addToEq(5))
fiveButton.grid(row=3, column=1, padx=2, pady=3)
sixButton = ttk.Button(win, text="6", pady=10, padx=20, font = "Serif 15",bg = "black", fg = "white", command=lambda: addToEq(6))
sixButton.grid(row=3, column=2, padx=2, pady=3)
minusButton = ttk.Button(win, text="-", pady=10, padx=20, font = "Serif 15",bg = "black", fg = "white", command=lambda: addToEq("-"))
minusButton.grid(row=3, column=3, padx=2, pady=3)
# div 3
sevenButton = ttk.Button(win, text="7", pady=10, padx=20, font = "Serif 15",bg = "black", fg = "white", command=lambda: addToEq(7))
sevenButton.grid(row=4, column=0, padx=2, pady=3)
eightButton = ttk.Button(win, text="8", pady=10, padx=20, font = "Serif 15",bg = "black", fg = "white", command=lambda: addToEq(8))
eightButton.grid(row=4, column=1, padx=2, pady=3)
nineButton = ttk.Button(win, text="9", pady=10, padx=20, font = "Serif 15",bg = "black", fg = "white", command=lambda: addToEq(9))
nineButton.grid(row=4, column=2, padx=2, pady=3)
muxButton = ttk.Button(win, text="x", pady=10, padx=20, font = "Serif 15",bg = "black", fg = "white", command=lambda: addToEq("*"))
muxButton.grid(row=4, column=3, padx=2, pady=3)
#div 4
zeroButton = ttk.Button(win, text="0", pady=10, padx=20, font = "Serif 15",bg = "black", fg = "white", command=lambda: addToEq(0))
zeroButton.grid(row=5, column=0, padx=2, pady=3)
clearButton = ttk.Button(win, text="clr", pady=10, padx=20, font = "Serif 15",bg = "black", fg = "white", command=clearInput)
clearButton.grid(row=5, column=1, padx=2, pady=3)
calculateButton = ttk.Button(win, text="cal", pady=10, padx=20, font = "Serif 15",bg = "black", fg = "white", command=calculateEq)
calculateButton.grid(row=5, column=2, padx=2, pady=3)
divideButton = ttk.Button(win, text="/", pady=10, padx=20, font = "Serif 15",bg = "black", fg = "white", command=lambda: addToEq("/"))
divideButton.grid(row=5, column=3, padx=2, pady=3)
Параметры Button включают объект окна, текст на кнопке, стиль шрифта, отступы и особенно аргумент command, который вызывается при клике.
Для выравнивания используйте grid и указывайте row/column. Для поля с текущим выражением применяют Entry и StringVar:
numericEq = ttk.StringVar()
dataField = ttk.Entry(win, textvariable=numericEq, font="Serif 15")
dataField.grid(row=0,columnspan=3, ipadx=80, ipady=15)

Entry — это однострочное поле ввода. textvariable связывает поле с объектом StringVar, который обновляет отображаемое значение.
Добавление функциональности кнопок
Команда для кнопки принимает функцию или метод. В примере используют lambda, чтобы передать значения в общую функцию addToEq(). Ниже описано поведение основных методов.
1. Числовые и арифметические кнопки
Кнопки 0–9 и арифметические операторы добавляют символы в текущее выражение. В исходном простом варианте используется функция addToEq, которая обновляет строку calcValue и отображение numericEq.
def addToEq(x):
calcValue = calcValue + str(x)
numericEq.set(calcValue)
Важно: в этом фрагменте пропущено упоминание о том, что calcValue должна быть доступна внутри функции — обычно это делается через global или замыкание (см. исправленный пример ниже).
2. Кнопка вычисления
Кнопка с ярлыком cal вычисляет выражение, хранящееся в calcValue. Для простоты используют eval(), чтобы выполнить арифметику, и затем ставят результат в numericEq:
def calculateEq():
total = str(eval(calcValue))
numericEq.set(total)
Важное замечание по безопасности: eval выполняет произвольный код — не используйте eval на входных данных, которым вы не доверяете. Для учебного калькулятора это приемлемо, для реальных приложений — используйте парсер выражений или библиотеку.
3. Кнопка очистки
Кнопка clr очищает поле ввода: функция сбрасывает calcValue и numericEq.
def clearInput():
calcValue = ""
numericEq.set("")
После реализации этих методов интерфейс покажет результат вычисления.

Частые ошибки и исправления
Important: Самая распространённая ошибка в примерах — не учитывать область видимости calcValue. В функциях нужно объявить calcValue как глобальную, либо использовать класс/замыкание.
Ниже — минимально исправленный фрагмент с использованием global (сохраняйте исходные блоки выше; этот блок — рекомендация для рабочей программы):
calcValue = ""
def addToEq(x):
global calcValue
calcValue = calcValue + str(x)
numericEq.set(calcValue)
def calculateEq():
global calcValue
try:
total = str(eval(calcValue))
except Exception:
total = "Ошибка"
calcValue = total
numericEq.set(total)
def clearInput():
global calcValue
calcValue = ""
numericEq.set("")
Альтернатива объявлению global — обернуть логику в класс и хранить calcValue как атрибут экземпляра.
Альтернативные подходы
- PyQt / PySide: более мощные и красивые интерфейсы, steeper learning curve. Подходит для коммерческих настольных приложений.
- Kivy: совместимость с мобильными платформами, гибкие визуальные эффекты.
- Web‑интерфейс (Flask/Django + Electron): удобно, если вы хотите переиспользовать код в браузере или на разных платформах.
Когда избегать Tkinter: требуются сложные кастомные контролы, высокий уровень стилизации, масштабируемость под мобильные устройства.
Мини‑методология: шаги для реализации рабочего калькулятора
- Спроектируйте макет: поле ввода + сетка кнопок.
- Создайте объект окна и виджеты (Entry, Button).
- Реализуйте управление состоянием (calcValue) — класс или глобальная переменная.
- Добавьте обработчики кнопок с проверками входа.
- Замените eval() парсером, если требуется безопасность.
- Покройте тестами (unit tests) основные выражения и ошибки деления на ноль.
Чек‑лист ролей
- Для новичка: собрать рабочий интерфейс, понять grid и StringVar, обеспечить очистку и вычисление.
- Для разработчика: вынести логику в класс, обработать исключения, добавить логирование ошибок.
- Для тестировщика: проверить ввод длинных выражений, проверку на некорректный ввод, деление на ноль и работоспособность клавиш клавиатуры.
Безопасность и расширение функционала
- Не используйте eval на неподконтрольных данных — замените вычисления безопасным парсером выражений.
- Для локальных утилит это упрощение приемлемо, но для публичных сервисов — риск удалённого выполнения кода.
Критерии приёмки
- Интерфейс запускается без ошибок на чистом CPython с предустановленным Tkinter.
- Все кнопки вводят соответствующие символы и обновляют поле.
- Функция вычисления корректно обрабатывает базовые выражения и ошибки (деление на ноль, синтаксическая ошибка => показывать “Ошибка”).
- Очистка сбрасывает состояние.
Когда это не подходит
- Проект требует сложной кастомной графики или анимации.
- Приложение должно быть кроссплатформенным для мобильных платформ без переработки.
Короткое резюме
- Tkinter — быстрый способ сделать прототип GUI на Python.
- Следите за областью видимости переменных (global или класс).
- eval удобен для демонстраций, но небезопасен для общедоступных приложений.
Применяйте этот пример как учебный проект: расширяйте его, заменяйте eval безопасным парсером, оборачивайте логику в класс и добавляйте тесты. Удачи в изучении и создании собственных проектов — практика и проекты лучшим образом развивают навыки.
Похожие материалы
Установка GitHub CLI на Linux
Как установить Epic Games и играть на Linux
Как сделать Stitch в TikTok — полное руководство
TEXTSPLIT, TEXTBEFORE, TEXTAFTER в Excel
Изменение значков и цветов в приложении «Дом»