Гид по технологиям

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

5 min read Python GUI Обновлено 08 Apr 2026
Простой калькулятор на Python с Tkinter
Простой калькулятор на 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)  

Простой калькулятор на Python с Tkinter, изображение интерфейса

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: требуются сложные кастомные контролы, высокий уровень стилизации, масштабируемость под мобильные устройства.

Мини‑методология: шаги для реализации рабочего калькулятора

  1. Спроектируйте макет: поле ввода + сетка кнопок.
  2. Создайте объект окна и виджеты (Entry, Button).
  3. Реализуйте управление состоянием (calcValue) — класс или глобальная переменная.
  4. Добавьте обработчики кнопок с проверками входа.
  5. Замените eval() парсером, если требуется безопасность.
  6. Покройте тестами (unit tests) основные выражения и ошибки деления на ноль.

Чек‑лист ролей

  • Для новичка: собрать рабочий интерфейс, понять grid и StringVar, обеспечить очистку и вычисление.
  • Для разработчика: вынести логику в класс, обработать исключения, добавить логирование ошибок.
  • Для тестировщика: проверить ввод длинных выражений, проверку на некорректный ввод, деление на ноль и работоспособность клавиш клавиатуры.

Безопасность и расширение функционала

  • Не используйте eval на неподконтрольных данных — замените вычисления безопасным парсером выражений.
  • Для локальных утилит это упрощение приемлемо, но для публичных сервисов — риск удалённого выполнения кода.

Критерии приёмки

  • Интерфейс запускается без ошибок на чистом CPython с предустановленным Tkinter.
  • Все кнопки вводят соответствующие символы и обновляют поле.
  • Функция вычисления корректно обрабатывает базовые выражения и ошибки (деление на ноль, синтаксическая ошибка => показывать “Ошибка”).
  • Очистка сбрасывает состояние.

Когда это не подходит

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

Короткое резюме

  • Tkinter — быстрый способ сделать прототип GUI на Python.
  • Следите за областью видимости переменных (global или класс).
  • eval удобен для демонстраций, но небезопасен для общедоступных приложений.

Применяйте этот пример как учебный проект: расширяйте его, заменяйте eval безопасным парсером, оборачивайте логику в класс и добавляйте тесты. Удачи в изучении и создании собственных проектов — практика и проекты лучшим образом развивают навыки.

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Установка GitHub CLI на Linux
Разработка

Установка GitHub CLI на Linux

Как установить Epic Games и играть на Linux
Linux

Как установить Epic Games и играть на Linux

Как сделать Stitch в TikTok — полное руководство
Социальные сети

Как сделать Stitch в TikTok — полное руководство

TEXTSPLIT, TEXTBEFORE, TEXTAFTER в Excel
Excel

TEXTSPLIT, TEXTBEFORE, TEXTAFTER в Excel

Изменение значков и цветов в приложении «Дом»
Умный дом

Изменение значков и цветов в приложении «Дом»

Исправить уведомления WhatsApp в Windows 10
Технологии

Исправить уведомления WhatsApp в Windows 10