реклама
Бургер менюБургер меню

Нави Тулаг – От датчика до интерфейса. Практическое руководство по созданию инженерных десктоп приложений на Python и web-технологиях (страница 12)

18

Забыли @eel.expose

Добавьте декоратор в Python

Две пары скобок?

Синтаксис Eel

eel.func()() — это нормально!

Порт занят

Другой Eel запущен

Закройте предыдущий процесс или укажите port=8081

5.9. Подготовка к следующему шагу: Режим эмуляции

В следующих главах мы будем работать с COM-портами и Arduino. Но что если у вас нет устройства под рукой?

Мы внедрим режим эмуляции (DEBUG_MODE) с самого начала.

Вот как это будет выглядеть в main.py:

💡

Важно: Мы вернёмся к этому в Главе 10, но уже сейчас вы понимаете философию: тестируйте без железа, развёртывайте с железом.

Что мы узнали?

✅ Eel устанавливается за 1 минуту через pip install eel.

✅ Структура проекта: main.py + папка www/ с HTML/CSS/JS.

✅ Связка Python ↔ JS: декоратор @eel.expose + вызов eel.func()().

✅ Первое приложение работает за 10 минут без глубоких знаний веба.

✅ Режимы запуска позволяют выбрать браузер и размер окна.

✅ Виртуальное окружение — хорошая практика для будущей упаковки в .exe.

📋 Практическое задание

Создайте проект по структуре из раздела 5.3.

Запустите калькулятор из этой главы.

Модифицируйте приложение:

3.a. Добавьте третье поле: «Сопротивление (Ом)».

3.b. Создайте Python-функцию calculate_resistance(voltage, current), которая возвращает сопротивление по закону Ома: R = U / I.

3.c. Добавьте кнопку «Рассчитать сопротивление» и отобразите результат.

Поэкспериментируйте с режимом запуска:

4.a. Измените размер окна на (800, 600).

4.b. Попробуйте mode='chrome' и mode='edge' — есть ли разница?

Добавьте обработку ошибок:

5.a. Что будет, если ввести 0 в поле тока при расчёте сопротивления?

5.b. Реализуйте проверку в Python и верните понятное сообщение об ошибке.

💡 Пример решения для 3.b:

В следующей главе мы углубимся в механизм вызовов: как передавать сложные данные (списки, словари), как вызывать JavaScript из Python и как обрабатывать ошибки. Вы научитесь строить двусторонний мост между бэкендом и фронтендом.

Глава 6: Связка Python и JS. Вызов функций, передача данных, асинхронность без блокировки UI

О чём эта глава?

Вы уже создали первое приложение на Eel и увидели, как Python и JavaScript могут работать вместе. Но настоящее мастерство — в понимании того, как они общаются.

В этой главе вы узнаете:

✅ Как вызывать Python-функции из JavaScript (и наоборот) с правильной синхронизацией.

✅ Как передавать сложные данные — списки, словари, JSON-объекты.

✅ Почему UI зависает при чтении COM-порта и как этого избежать.

✅ Как использовать threading (многопоточность) для фоновых* задач без блокировки интерфейса.

✅ Как обрабатывать ошибки на обеих сторонах моста.

П р и м е ч а н и е* - фоновые задачи – это операции, которые не должны блокировать основной поток (особенно графический интерфейс). Например: загрузка файлов из сети, обработка больших данных, отправка запросов к API, логирование (процесс регистрации данных), мониторинг состояния системы.

К концу главы вы сможете создать приложение, которое читает данные с датчиков в реальном времени, не замораживая интерфейс.

6.1. Двусторонний мост: как работает связь

Eel создаёт мост между Python и JavaScript через локальный веб-сервер. Когда вы вызываете функцию из JS в Python (или наоборот), запрос проходит через этот сервер.

Ключевой момент: Eel использует асинхронные вызовы. Это значит, что JavaScript не ждёт ответа Python — он продолжает работать. Но для получения результата нужно использовать await.

6.2. Вызов Python из JavaScript: правильный синтаксис

Базовый пример

Вот как выглядит типичный вызов Python-функции из JavaScript:

Почему две пары скобок?

Это частый вопрос новичков. Давайте разберёмся:

💡 Запомните: await eel.function_name(args)() — это стандартный паттерн Eel.

Обработка ошибок

Python-исключения передаются в JavaScript как ошибки Promise:

6.3. Передача сложных данных

Eel поддерживает все типы, которые можно сериализовать в JSON:

Пример: передача словаря

Пример: передача списка данных для графика

6.4. Вызов JavaScript из Python

Иногда нужно обновить интерфейс из Python — например, при поступлении новых данных с датчика.

Базовый пример