import tkinter as tk
from tkinter import ttk, messagebox

class CalculatorApp:
    def __init__(self, root):
        self.root = root
        self.root.title("Калькулятор")
        self.root.resizable(False, False)

        self.display_var = tk.StringVar(value="0")
        self.current = ""
        self.stored = None
        self.pending_op = None

        self.create_widgets()
        self.bind_keys()

    def create_widgets(self):
        display = ttk.Entry(self.root, textvariable=self.display_var, font=("Arial", 20), justify="right", state="readonly")
        display.grid(row=0, column=0, columnspan=4, sticky="ew", padx=5, pady=5)
        display.bind("<Double-Button-1>", lambda e: self.reset())

        buttons = [
            ("1", 1, 0), ("2", 1, 1), ("3", 1, 2), ("+", 1, 3),
            ("4", 2, 0), ("5", 2, 1), ("6", 2, 2), ("-", 2, 3),
            ("7", 3, 0), ("8", 3, 1), ("9", 3, 2), ("=", 3, 3),
            ("C", 4, 0)
        ]

        for (text, row, col) in buttons:
            btn = ttk.Button(self.root, text=text, command=lambda t=text: self.press(t))
            if text == "C":
                btn.grid(row=row, column=col, columnspan=4, sticky="ew", padx=2, pady=2, ipadx=10, ipady=10)
            else:
                btn.grid(row=row, column=col, sticky="nsew", padx=2, pady=2, ipadx=10, ipady=10)

        for i in range(4):
            self.root.grid_columnconfigure(i, weight=1)
        for i in range(5):
            self.root.grid_rowconfigure(i, weight=1)

    def press(self, key):
        if key.isdigit():
            self.current += key
            self.display_var.set(self.current)
        elif key in ("+", "-"):
            self.handle_operator(key)
        elif key == "=":
            self.handle_equals()
        elif key == "C":
            self.reset()
        else:
            pass

    def handle_operator(self, op):
        try:
            if self.pending_op is not None and self.stored is not None:
                if self.current:
                    result = self.calculate(self.stored, float(self.current), self.pending_op)
                    self.stored = result
                    self.pending_op = op
                    self.current = ""
                    self.display_var.set(self.format_number(result))
                else:
                    self.pending_op = op
            elif self.current:
                self.stored = float(self.current)
                self.pending_op = op
                self.current = ""
            elif self.stored is not None:
                self.pending_op = op
            else:
                pass
        except Exception as e:
            messagebox.showerror("Ошибка", f"Произошла ошибка: {e}")
            self.reset()

    def handle_equals(self):
        try:
            if self.pending_op is not None and self.stored is not None and self.current:
                result = self.calculate(self.stored, float(self.current), self.pending_op)
                self.display_var.set(self.format_number(result))
                self.stored = result
                self.pending_op = None
                self.current = ""
        except Exception as e:
            messagebox.showerror("Ошибка", f"Произошла ошибка: {e}")
            self.reset()

    def calculate(self, a, b, op):
        if op == "+":
            return a + b
        elif op == "-":
            return a - b
        else:
            raise ValueError("Неизвестная операция")

    def format_number(self, num):
        if num == int(num):
            return str(int(num))
        else:
            return str(num)

    def reset(self):
        self.current = ""
        self.stored = None
        self.pending_op = None
        self.display_var.set("0")

    def bind_keys(self):
        self.root.bind("<Key>", self.on_key)

    def on_key(self, event):
        key = event.char
        if key in "123456789":
            self.press(key)
        elif key == "+":
            self.press("+")
        elif key == "-":
            self.press("-")
        elif key in ("=", "\r"):
            self.press("=")
        elif key.lower() == "c":
            self.reset()
        elif event.keysym == "BackSpace":
            if self.current:
                self.current = self.current[:-1]
                self.display_var.set(self.current if self.current else "0")
            else:
                self.reset()

if __name__ == "__main__":
    root = tk.Tk()
    app = CalculatorApp(root)
    root.mainloop()