import tkinter as tk
class Calculator:
def __init__(self, root):
self.root = root
self.root.title("Calculator")
self.expression = ""
self.input_text = tk.StringVar()
self.create_widgets()
def create_widgets(self):
input_frame = tk.Frame(self.root, width=312, height=50, bd=0, highlightbackground="black", highlightcolor="black", highlightthickness=1)
input_frame.pack(side=tk.TOP)
input_field = tk.Entry(input_frame, font=('arial', 18, 'bold'), textvariable=self.input_text, width=50, bg="#eee", bd=0, justify=tk.RIGHT)
input_field.grid(row=0, column=0)
input_field.pack(ipady=10)
buttons_frame = tk.Frame(self.root, width=312, height=272.5, bg="grey")
buttons_frame.pack()
# Row 1
self.create_button(buttons_frame, "7", 1, 0)
self.create_button(buttons_frame, "8", 1, 1)
self.create_button(buttons_frame, "9", 1, 2)
self.create_button(buttons_frame, "/", 1, 3)
# Row 2
self.create_button(buttons_frame, "4", 2, 0)
self.create_button(buttons_frame, "5", 2, 1)
self.create_button(buttons_frame, "6", 2, 2)
self.create_button(buttons_frame, "*", 2, 3)
# Row 3
self.create_button(buttons_frame, "1", 3, 0)
self.create_button(buttons_frame, "2", 3, 1)
self.create_button(buttons_frame, "3", 3, 2)
self.create_button(buttons_frame, "-", 3, 3)
# Row 4
self.create_button(buttons_frame, "0", 4, 0)
self.create_button(buttons_frame, ".", 4, 1)
self.create_button(buttons_frame, "=", 4, 2)
self.create_button(buttons_frame, "+", 4, 3)
# Clear button
clear_button = tk.Button(buttons_frame, text="C", fg="black", width=32, height=3, bd=0, bg="#eee", cursor="hand2", command=self.clear)
clear_button.grid(row=5, column=0, columnspan=4)
def create_button(self, frame, text, row, col):
button = tk.Button(frame, text=text, fg="black", width=10, height=3, bd=0, bg="#fff", cursor="hand2", command=lambda: self.add_to_expression(text))
button.grid(row=row, column=col, padx=1, pady=1)
def add_to_expression(self, value):
if value == ".":
# Only add dot if there is no dot in the current number segment
if self.expression and self.expression[-1].isdigit():
parts = self.expression.split("+") + self.expression.split("-") + self.expression.split("*") + self.expression.split("/")
if "." not in parts[-1]:
self.expression += value
self.input_text.set(self.expression)
else:
self.expression += value
self.input_text.set(self.expression)
def clear(self):
self.expression = ""
self.input_text.set("")
def evaluate(self):
try:
result = str(eval(self.expression))
self.expression = result
self.input_text.set(result)
except:
self.input_text.set("error")
self.expression = ""
if __name__ == "__main__":
root = tk.Tk()
calculator = Calculator(root)
root.mainloop()
import tkinter as tk
from typing import Callable
class Calculator:
def __init__(self, master: tk.Tk):
self.master = master
self.master.title("Калькулятор")
self.result_var = tk.StringVar()
self.result_var.set("0")
self.current_number = "0"
self.last_operation = None
self.result = 0
self.setup_ui()
def setup_ui(self):
# Создание и размещение элементов интерфейса
tk.Entry(self.master, textvariable=self.result_var, justify="right").grid(
row=0, column=0, columnspan=4, sticky="nsew")
buttons = [
'7', '8', '9', '/',
'4', '5', '6', '*',
'1', '2', '3', '-',
'0', '.', '=', '+'
]
for i, button in enumerate(buttons):
row, col = divmod(i, 4)
tk.Button(self.master, text=button, command=lambda x=button: self.on_button_click(
x)).grid(row=row+1, column=col, sticky="nsew")
for i in range(5):
self.master.grid_rowconfigure(i, weight=1)
for i in range(4):
self.master.grid_columnconfigure(i, weight=1)
def on_button_click(self, button: str):
if button.isdigit():
self.add_digit(button)
elif button == '.':
self.add_decimal_point()
elif button in {'+', '-', '*', '/'}:
self.add_operation(button)
elif button == '=':
self.calculate_result()
def add_digit(self, digit: str):
if self.current_number == "0":
self.current_number = digit
else:
self.current_number += digit
self.update_display()
def add_decimal_point(self):
if '.' not in self.current_number:
self.current_number += '.'
self.update_display()
def add_operation(self, operation: str):
self.calculate_result()
self.last_operation = operation
self.result = float(self.current_number)
self.current_number = "0"
def calculate_result(self):
if self.last_operation:
second_number = float(self.current_number)
operations = {
'+': lambda x, y: x + y,
'-': lambda x, y: x - y,
'*': lambda x, y: x * y,
'/': lambda x, y: x / y if y != 0 else float('inf')
}
self.result = operations[self.last_operation](
self.result, second_number)
self.current_number = str(self.result)
self.last_operation = None
self.update_display()
def update_display(self):
self.result_var.set(self.current_number)
if __name__ == "__main__":
root = tk.Tk()
calc = Calculator(root)
root.mainloop()