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, expand=True, ) 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__( controls=[ ] )