Python | Как сделать калькулятор на Python
Импорт библиотек
tkinter: Основная библиотека для создания графического интерфейса пользователя (GUI) в Python.
messagebox: Модуль для отображения сообщений об ошибках или других уведомлений пользователю.
Определение класса Calculator
Calculator: Класс, который наследует от tk.Tk, представляя собой основное окно приложения.
__init__: Конструктор класса, который инициализирует окно, настраивает его размеры и цвет фона, делает окно неизменяемым по размеру, создаёт виджеты и привязывает обработчик нажатий клавиш.
Создание виджетов
self.result_var: Объект StringVar, используемый для хранения текста, отображаемого в поле ввода.
self.entry: Поле ввода для отображения текущего выражения и результата. Настроено для отображения текста справа.
buttons: Список кнопок калькулятора с их текстом, позицией в сетке и (опционально) количеством объединённых ячеек.
tk.Button: Создаёт кнопки для калькулятора. Цвет кнопок определяется в зависимости от их функции (обычные или специальные кнопки C и =). command привязывает действие к нажатию кнопки.
self.grid_rowconfigure и self.grid_columnconfigure: Настройка поведения строк и колонок сетки для обеспечения правильного масштабирования виджетов.
Обработка нажатий кнопок
char: Символ, который был нажат на кнопке.
'C': Очищает поле ввода.
'=': Вычисляет результат выражения. Использует функцию eval для вычисления результата. Если выражение неверное, отображается сообщение об ошибке.
Другие символы: Добавляют символы к текущему выражению в поле ввода.
Обработка нажатий клавиш
event.char: Символ, соответствующий нажатой клавише.
event.keysym: Символьный код для специальных клавиш.
'Return': Обрабатывает нажатие клавиши Enter.
'BackSpace': Удаляет последний символ из строки.
key.lower() == 'c': Обрабатывает нажатие клавиши 'C'.
Запуск приложения
if __name__ == "__main__": Убедитесь, что код выполняется только при запуске скрипта напрямую, а не при импорте.
app = Calculator(): Создаёт экземпляр класса Calculator.
app.mainloop(): Запускает основной цикл обработки событий Tkinter.
Этот скрипт представляет собой простой калькулятор с графическим интерфейсом, который позволяет выполнять базовые арифметические операции и поддерживает ввод с клавиатуры.
import tkinter as tk
from tkinter import messagebox
tkinter: Основная библиотека для создания графического интерфейса пользователя (GUI) в Python.
messagebox: Модуль для отображения сообщений об ошибках или других уведомлений пользователю.
Определение класса Calculator
class Calculator(tk.Tk):
def __init__(self):
super().__init__()
self.title("Калькулятор")
self.geometry("350x500")
self.configure(bg="#2c3e50")
self.resizable(False, False)
self.create_widgets()
self.bind("<Key>", self.on_key_press) # Привязываем обработчик нажатий клавиш
Calculator: Класс, который наследует от tk.Tk, представляя собой основное окно приложения.
__init__: Конструктор класса, который инициализирует окно, настраивает его размеры и цвет фона, делает окно неизменяемым по размеру, создаёт виджеты и привязывает обработчик нажатий клавиш.
Создание виджетов
def create_widgets(self):
self.result_var = tk.StringVar()
self.entry = tk.Entry(self, textvariable=self.result_var, font=('Arial', 24), bd=0, relief='flat',
bg="#ecf0f1", fg="#2c3e50", justify='right')
self.entry.grid(row=0, column=0, columnspan=4, pady=20, padx=10, sticky='nsew')
buttons = [
('7', 1, 0), ('8', 1, 1), ('9', 1, 2), ('/', 1, 3),
('4', 2, 0), ('5', 2, 1), ('6', 2, 2), ('*', 2, 3),
('1', 3, 0), ('2', 3, 1), ('3', 3, 2), ('-', 3, 3),
('0', 4, 0), ('.', 4, 1), ('+', 4, 2), ('=', 4, 3),
('C', 5, 0, 4)
]
for button in buttons:
text = button[0]
row = button[1]
col = button[2]
colspan = button[3] if len(button) > 3 else 1
color = "#3498db" if text not in ['C', '='] else "#e74c3c"
button_widget = tk.Button(self, text=text, font=('Arial', 18), width=5, height=2,
bg=color, fg="#ecf0f1", bd=0, relief='flat',
command=lambda t=text: self.on_button_click(t))
button_widget.grid(row=row, column=col, columnspan=colspan, padx=5, pady=5, sticky='nsew')
for i in range(6):
self.grid_rowconfigure(i, weight=1)
for i in range(4):
self.grid_columnconfigure(i, weight=1)
self.result_var: Объект StringVar, используемый для хранения текста, отображаемого в поле ввода.
self.entry: Поле ввода для отображения текущего выражения и результата. Настроено для отображения текста справа.
buttons: Список кнопок калькулятора с их текстом, позицией в сетке и (опционально) количеством объединённых ячеек.
tk.Button: Создаёт кнопки для калькулятора. Цвет кнопок определяется в зависимости от их функции (обычные или специальные кнопки C и =). command привязывает действие к нажатию кнопки.
self.grid_rowconfigure и self.grid_columnconfigure: Настройка поведения строк и колонок сетки для обеспечения правильного масштабирования виджетов.
Обработка нажатий кнопок
def on_button_click(self, char):
if char == 'C':
self.result_var.set('')
elif char == '=':
try:
expression = self.result_var.get()
result = eval(expression)
self.result_var.set(result)
except Exception as e:
messagebox.showerror("Ошибка", f"Неверное выражение: {e}")
else:
current_text = self.result_var.get()
self.result_var.set(current_text + char)
char: Символ, который был нажат на кнопке.
'C': Очищает поле ввода.
'=': Вычисляет результат выражения. Использует функцию eval для вычисления результата. Если выражение неверное, отображается сообщение об ошибке.
Другие символы: Добавляют символы к текущему выражению в поле ввода.
Обработка нажатий клавиш
def on_key_press(self, event):
key = event.char
if key in '0123456789':
self.result_var.set(self.result_var.get() + key)
elif key in '+-*/':
current_text = self.result_var.get()
if current_text and current_text[-1] not in '+-*/':
self.result_var.set(current_text + key)
elif event.keysym == 'Return': # Нажатие клавиши Enter
self.on_button_click('=')
elif event.keysym == 'BackSpace': # Нажатие клавиши Backspace
current_text = self.result_var.get()
self.result_var.set(current_text[:-1])
elif key.lower() == 'c': # Нажатие клавиши C
self.on_button_click('C')
event.char: Символ, соответствующий нажатой клавише.
event.keysym: Символьный код для специальных клавиш.
'Return': Обрабатывает нажатие клавиши Enter.
'BackSpace': Удаляет последний символ из строки.
key.lower() == 'c': Обрабатывает нажатие клавиши 'C'.
Запуск приложения
if __name__ == "__main__":
app = Calculator()
app.mainloop()
if __name__ == "__main__": Убедитесь, что код выполняется только при запуске скрипта напрямую, а не при импорте.
app = Calculator(): Создаёт экземпляр класса Calculator.
app.mainloop(): Запускает основной цикл обработки событий Tkinter.
Этот скрипт представляет собой простой калькулятор с графическим интерфейсом, который позволяет выполнять базовые арифметические операции и поддерживает ввод с клавиатуры.
Полностью готовый код
import tkinter as tk
from tkinter import messagebox
class Calculator(tk.Tk):
def __init__(self):
super().__init__()
self.title("Калькулятор")
self.geometry("350x500")
self.configure(bg="#2c3e50")
self.resizable(False, False)
self.create_widgets()
self.bind("<Key>", self.on_key_press) # Привязываем обработчик нажатий клавиш
def create_widgets(self):
# Entry widget для отображения ввода
self.result_var = tk.StringVar()
self.entry = tk.Entry(self, textvariable=self.result_var, font=('Arial', 24), bd=0, relief='flat',
bg="#ecf0f1", fg="#2c3e50", justify='right')
self.entry.grid(row=0, column=0, columnspan=4, pady=20, padx=10, sticky='nsew')
# Кнопки калькулятора
buttons = [
('7', 1, 0), ('8', 1, 1), ('9', 1, 2), ('/', 1, 3),
('4', 2, 0), ('5', 2, 1), ('6', 2, 2), ('*', 2, 3),
('1', 3, 0), ('2', 3, 1), ('3', 3, 2), ('-', 3, 3),
('0', 4, 0), ('.', 4, 1), ('+', 4, 2), ('=', 4, 3),
('C', 5, 0, 4)
]
for button in buttons:
text = button[0]
row = button[1]
col = button[2]
colspan = button[3] if len(button) > 3 else 1
color = "#3498db" if text not in ['C', '='] else "#e74c3c"
button_widget = tk.Button(self, text=text, font=('Arial', 18), width=5, height=2,
bg=color, fg="#ecf0f1", bd=0, relief='flat',
command=lambda t=text: self.on_button_click(t))
button_widget.grid(row=row, column=col, columnspan=colspan, padx=5, pady=5, sticky='nsew')
# Настройка поведения строк и колонок
for i in range(6):
self.grid_rowconfigure(i, weight=1)
for i in range(4):
self.grid_columnconfigure(i, weight=1)
def on_button_click(self, char):
if char == 'C':
self.result_var.set('')
elif char == '=':
try:
expression = self.result_var.get()
result = eval(expression)
self.result_var.set(result)
except Exception as e:
messagebox.showerror("Ошибка", f"Неверное выражение: {e}")
else:
current_text = self.result_var.get()
self.result_var.set(current_text + char)
def on_key_press(self, event):
key = event.char
if key in '0123456789':
self.result_var.set(self.result_var.get() + key)
elif key in '+-*/':
current_text = self.result_var.get()
if current_text and current_text[-1] not in '+-*/':
self.result_var.set(current_text + key)
elif event.keysym == 'Return': # Нажатие клавиши Enter
self.on_button_click('=')
elif event.keysym == 'BackSpace': # Нажатие клавиши Backspace
current_text = self.result_var.get()
self.result_var.set(current_text[:-1])
elif key.lower() == 'c': # Нажатие клавиши C
self.on_button_click('C')
if __name__ == "__main__":
app = Calculator()
app.mainloop()