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. Этот скрипт представляет собой простой калькулятор с графическим интерфейсом, который позволяет выполнять базовые арифметические операции и поддерживает ввод с клавиатуры.
php
import tkinter as tk from tkinter import messagebox php
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) # Привязываем обработчик нажатий клавиш php
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) php
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) php
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') php
if __name__ == "__main__": app = Calculator() app.mainloop()
Полностью готовый код
php
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()