Metadata-Version: 2.4
Name: luckytools
Version: 1.2.4
Summary: Dependency-free terminal animations, algorithms and 3D rendering
Author-email: sayginaego.say@gmail.com
Requires-Python: >=3.9
Description-Content-Type: text/markdown
Dynamic: author-email
Dynamic: description
Dynamic: description-content-type
Dynamic: requires-python
Dynamic: summary

# LuckyTools 1.2.2

Консольная графика, анимации, обходы графов и 3D рендерер на стандартной библиотеке Python (3.9+).

```bash
pip install luckytools
luckytools .help
luckytools menu
luckytools maze --algorithm dijkstra
luckytools loader --style comet
luckytools collections
luckytools graph --algorithm dijkstra --layout force --style sunset
luckytools demo
luckytools graph --algorithm bfs --fill 6
luckytools 3d --shape torus --frames 100
python example.py
```

Без живой анимации добавьте `--no-animation` к команде или задайте `enabled=False` у `Animator` / `Renderer3D.animate()`. Для перенаправленного вывода программа автоматически печатает только последний кадр. `read_key(timeout=1)` считывает клавишу без дополнительных библиотек в интерактивном терминале.

`python example.py` сразу открывает живое меню: стрелки ↑/↓ выбирают сцену, Enter запускает, Esc выходит. Включены куб, пирамида, тор, видимый граф, лабиринт, Дейкстра, сортировка и прелоадеры. `python example.py --no-animation` печатает статический образец.

Собственное меню:

```python
from luckytools import Menu, MenuTheme, Animator

menu = Menu(title="Моя программа", theme=MenuTheme(accent="FF68B2"))
menu.add("Старт", lambda m: Animator(stream=m.stream).loader("Загрузка", "comet", 2))
menu.add("Выход", lambda m: False)
menu.run()
```

Полный пример — `custom_menu_example.py`. Для произвольного графа используйте `GraphView(graph, positions=...)`, для лабиринта — `MazeView(rows)`. Методы `bfs`, `dfs`, `dijkstra`, `astar` возвращают шаги обхода; `shortest_path` возвращает путь и стоимость.

Анимация стандартных контейнеров и обычного алгоритма:

```python
from collections import deque
from luckytools import AnimationSession

session = AnimationSession()
queue = session.watch(deque([1, 2]), "Моя очередь")
queue.append(3)
queue.popleft()
session.play()
```

В `collections_example.py` показаны `deque`, `Counter` и `session.trace(function, ...)`. Обёртка `watch` записывает изменения, только если операции проходят через возвращённый объект. Для произвольной функции `trace` записывает значения локальных переменных; можно передать `capture=lambda locals: ...` для выбора данных. `GraphView` поддерживает `layout="circle"`, `"grid"`, `"layered"`, `"force"` и темы `style="neon"`, `"sunset"`, `"forest"`, `"mono"`. Функция `as_graph` принимает словарь смежности или объект графа с методами `nodes()` и `edges(data=True)`.

Алгоритм можно также пометить `@session.animate` (или `@session.animate(capture=...)`): он выполнится один раз, а затем покажет записанные состояния строк.

В консолях IDE, где `sys.stdout.isatty()` возвращает `False`, но ANSI-коды поддерживаются, используйте `Animator(force=True)`. `LuckyTools().print("Привет", animate=True)` сам выводит цвет и анимацию в такой консоли. Готовый пример BFS: `Lesson_6.py`.

Подробные аргументы и список Python методов: `luckytools .help`.
