Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Помогите с кодом python tkinter, точка на калькуляторе

Аглеб Ёгроб Ученик (195), на голосовании 2 месяца назад
хотел сделать калькулятор, дошёл до точки. пытался добавлять "." через функцию add_operation, но получается, что в числе может быть 2+ точки, как это исправить?
Голосование за лучший ответ
olimchik Мастер (1195) 3 месяца назад
Чтобы сделать калькулятор на Python с использованием Tkinter и правильно обрабатывать точки в числах, вам нужно добавить проверку, чтобы точка добавлялась только если в текущем числе её ещё нет. Вот пример кода, который это делает:
 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()
olimchikМастер (1195) 3 месяца назад
В этом примере кода:

1. Функция add_to_expression добавляет цифры и операторы к текущему выражению.
2. При добавлении точки проверяется, что в текущем числе её ещё нет, чтобы предотвратить добавление второй точки.
3. Функция clear очищает текущее выражение.
4. Функция evaluate вычисляет результат выражения, используя функцию eval.

Этот код создаёт простой калькулятор, который корректно обрабатывает числа с десятичными точками, гарантируя, что в одном числе не будет более одной точки.
Celtic Hammer Мудрец (15920) 3 месяца назад
Все эти "точки" в калькуляторах это не то что у бота сверху, а парсинг математического выражения из строки в набор токенов - массив знаков операций и целых или дробных чисел. Например нужно получить из строки '45+68.09' массив [45, '+', 68.09]. Чтобы вычислить значение выражения обратной польской нотацией.
Вполне получили требуемое. Ну а для борьбы с лишними точками например ставим обработку исключения TypeError, которое будет выводит сообщение об ошибке ==>
꧁Tester꧂ ︎ Мудрец (19191) 3 месяца назад
В нормальном числе не может быть двух точек.
Как правило если их несколько, то это просто декоративная составляющая.
По этому просто делай замену точек на "" а потом при выводе форматируй результат.
Татьяна Просветленный (36197) 3 недели назад
 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()
Похожие вопросы