math pull

This commit is contained in:
2025-11-10 12:38:21 +05:00
parent 0c623d4bc5
commit 346c17f47f
7 changed files with 636 additions and 703 deletions

View File

@@ -1,5 +1,11 @@
import flet as ft
from flet.core.types import OptionalControlEventCallable
import sys
import os
# Добавляем путь к модулю step_by_step_solver
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
from step_by_step_solver import StepByStepSolver, Operation
right_column = ft.Column(
horizontal_alignment=ft.CrossAxisAlignment.CENTER,
@@ -10,6 +16,145 @@ right_column = ft.Column(
alphabet="αβγδεζηθικλμνξοπρστυφχψω"
class StepByStepDisplay:
"""
Класс для отображения пошагового решения в калькуляторах
Предоставляет унифицированный интерфейс для визуализации шагов решения
"""
# Размеры текста для различных элементов
HEADER_SIZE = 16
STEP_TITLE_SIZE = 14
DESCRIPTION_SIZE = 12
VISUAL_SIZE = 12
RESULT_SIZE = 13
ERROR_SIZE = 12
MESSAGE_SIZE = 14
@staticmethod
def create_steps_container(steps_column: ft.Column, height: int = None, width: int = None, expand: bool = True) -> ft.Container:
"""
Создает контейнер для отображения шагов решения
Args:
steps_column: колонка с шагами
height: высота контейнера (опционально)
width: ширина контейнера (опционально)
expand: растягивать контейнер (по умолчанию True)
Returns:
ft.Container с настроенным стилем
"""
container_props = {
"content": steps_column,
"bgcolor": "#1A0A2A",
"padding": 10,
"border_radius": 5,
}
if expand:
container_props["expand"] = True
if height:
container_props["height"] = height
if width:
container_props["width"] = width
return ft.Container(**container_props)
@staticmethod
def show_steps(steps_column: ft.Column, solver: StepByStepSolver, num1: str, num2: str, operation: Operation):
"""
Отображает пошаговое решение в указанной колонке
Args:
steps_column: колонка для отображения шагов
solver: экземпляр StepByStepSolver для получения шагов
num1: первое число (строка)
num2: второе число (строка)
operation: операция (Operation.ADDITION, SUBTRACTION, MULTIPLICATION, DIVISION)
"""
try:
# Получаем шаги решения
steps = solver.solve(num1, num2, operation)
# Очищаем предыдущие шаги
steps_column.controls.clear()
# Добавляем заголовок
steps_column.controls.append(
ft.Text("📝 Ход решения:", size=StepByStepDisplay.HEADER_SIZE, weight=ft.FontWeight.BOLD, color="#FFD700")
)
# Добавляем каждый шаг
for i, step in enumerate(steps, 1):
step_content = []
# Название шага
step_content.append(
ft.Text(f"Шаг {i}: {step.title}",
size=StepByStepDisplay.STEP_TITLE_SIZE, weight=ft.FontWeight.BOLD, color="#00FFFF")
)
# Описание
step_content.append(
ft.Text(step.description, size=StepByStepDisplay.DESCRIPTION_SIZE, color="#E0E0E0")
)
# Визуализация (если есть)
if step.visual:
step_content.append(
ft.Text(step.visual,
size=StepByStepDisplay.VISUAL_SIZE,
font_family="Courier New",
color="#90EE90",
selectable=True)
)
# Результат (если есть)
if step.result:
step_content.append(
ft.Text(f"{step.result}",
size=StepByStepDisplay.RESULT_SIZE,
weight=ft.FontWeight.BOLD,
color="#00FF00")
)
# Добавляем контейнер с шагом
steps_column.controls.append(
ft.Container(
content=ft.Column(step_content, spacing=3),
bgcolor="#2A1A3A",
padding=8,
border_radius=5,
border=ft.border.all(1, "#4A3A5A")
)
)
steps_column.update()
except Exception as ex:
steps_column.controls.clear()
steps_column.controls.append(
ft.Text(f"Ошибка при генерации решения: {str(ex)}", color="red", size=StepByStepDisplay.ERROR_SIZE)
)
steps_column.update()
@staticmethod
def show_message(steps_column: ft.Column, message: str, color: str = "#FFD700"):
"""
Отображает сообщение в колонке шагов (например, для дробных чисел)
Args:
steps_column: колонка для отображения
message: текст сообщения
color: цвет текста (по умолчанию золотой)
"""
steps_column.controls.clear()
steps_column.controls.append(
ft.Text(message, color=color, size=StepByStepDisplay.MESSAGE_SIZE)
)
steps_column.update()
class Obstr(ft.Column):
def __init__(self):
super().__init__(