Вот подробный README.md для вашего проекта:
# Калькулятор питательных сред
Программа для расчёта состава питательных сред с поддержкой разбавленных реагентов.
## 📋 Функционал
- **Расчёт состава среды** по процентному содержанию компонентов
- **Поддержка разных единиц измерения** (нг, мкг, мг, г, кг, нл, мкл, мл, л)
- **Коэффициент пересчёта** для каждого реагента (например, для перевода объёма в массу)
- **Разбавление реагентов** — возможность указать, во сколько раз разбавлен исходный реактив
- **Автоматический расчёт растворителя** с учётом объёма вносимых разбавленных реагентов
- **Сохранение и загрузка** состава в JSON-файл
- **Интерактивная таблица** с возможностью добавления/удаления реагентов
## 🚀 Установка и запуск
### Требования
- Python 3.6 или выше
- PyQt5
### Установка зависимостей
```bash
pip install PyQt5
Запуск программы
python main.py
📖 Использование
Основные параметры
- Общее количество — конечный объём/масса готовой среды
- Единица измерения — нл, мкл, мл, л
- Растворитель — название растворителя (отображается в первой строке таблицы)
Таблица реагентов
| Колонка | Описание |
|---|---|
| Название | Имя реагента |
| % | Процентное содержание в конечной среде |
| Единица | В каких единицах измеряется реагент |
| Коэфф. | Коэффициент пересчёта (например, для перевода объёма в массу) |
| Разбавление (x) | Во сколько раз разбавлен исходный реактив (1 = не разбавлен) |
| Нужно взять (разб.) | Рассчитанное количество разбавленного реагента |
Пример расчёта
Задача: Приготовить 100 мл питательной среды с 10% соли.
Вариант 1 — соль не разбавлена:
- Разбавление = 1
- Нужно взять: 10 г соли
- Растворителя: 100 мл
Вариант 2 — есть 10-кратно разбавленная соль:
- Разбавление = 10
- Нужно взять: 1 мл разбавленной соли (10 г / 10)
- Растворителя: 99 мл (100 мл - 1 мл)
🧠 Особенности реализации
Расчёт растворителя
Важное примечание: При расчёте объёма растворителя учитываются только те реагенты, которые заданы в объёмных единицах (нл, мкл, мл, л). Реагенты в единицах массы (нг, мкг, мг, г, кг) считаются не имеющими объёма и не влияют на расчёт растворителя.
Это сделано потому, что:
- Массовые реагенты обычно добавляются в твёрдом виде и их объём пренебрежимо мал
- Для корректного учёта объёма твёрдых веществ потребовалась бы плотность
# Пример из model.py
if is_volume:
# Реагент в объёмных единицах — учитываем его объём
reagent_volume_base = diluted_amount * VOLUME_UNITS[reagent.unit]
else:
# Реагент в массовых единицах — не учитываем (объём = 0)
reagent_volume_base = 0
Алгоритм расчёта
-
Расчёт неразбавленного состава
- Количество чистого вещества = (процент / 100) × общий объём
-
Пересчёт с учётом разбавления
- Количество разбавленного реагента = чистое вещество / фактор разбавления
-
Расчёт объёма вносимых реагентов
- Для объёмных реагентов: объём = количество разбавленного реагента
- Для массовых реагентов: объём = 0
-
Расчёт растворителя
- Объём растворителя = общий объём − сумма объёмов всех реагентов
📁 Структура проекта
nutrient_medium_pyqt/
├── main.py # Точка входа, инициализация приложения
├── controller.py # Контроллер — связь между моделью и представлением
├── model.py # Модель — бизнес-логика и расчёты
├── view.py # Представление — GUI на PyQt5
├── reagent.py # Класс Reagent для хранения данных
└── README.md # Документация
🔧 Описание кода
main.py
Инициализирует QApplication, создаёт экземпляр Controller и запускает главный цикл обработки событий.
reagent.py
class Reagent:
def __init__(self, name: str, percentage: float, unit: str, conversion_factor: float = 1.0)
Хранит данные о реагенте:
name— названиеpercentage— процентное содержаниеunit— единица измеренияconversion_factor— коэффициент пересчётаdilution_factor— коэффициент разбавления (добавляется динамически)
model.py
Содержит бизнес-логику программы:
Константы:
VOLUME_UNITS = {'нл': 0.001, 'мкл': 1.0, 'мл': 1000.0, 'л': 1000000.0}
MASS_UNITS = {'нг': 0.000001, 'мкг': 0.001, 'мг': 1.0, 'г': 1000.0, 'кг': 1000000.0}
Основные методы:
convert_amount()— пересчёт между единицами измерения через базовые (мкл для объёма, мкг для массы)calculate_amounts()— главный расчётный методsave_to_file()/load_from_file()— сериализация в JSON
view.py
Реализует графический интерфейс на PyQt5:
Основные компоненты:
QDoubleSpinBoxдля общего количестваQComboBoxдля выбора единиц измеренияQTableWidgetдля таблицы реагентов (6 колонок)- Кнопки: Добавить, Удалить, Рассчитать, Сохранить, Загрузить
Ключевые методы:
add_solvent_row()— создаёт нередактируемую строку растворителяadd_new_row()— добавляет строку реагентаupdate_results()— обновляет результаты расчётаupdate_solvent_result()— обновляет количество растворителя
controller.py
Координирует взаимодействие Model и View:
Сигналы (слоты):
add_row_btn.clicked→add_reagent_row()calculate_btn.clicked→_perform_calculation()save_btn.clicked→save_composition()load_btn.clicked→load_composition()
Основные методы:
_update_model_from_view()— переносит данные из таблицы в модель_update_view_from_model()— заполняет таблицу из модели_perform_calculation()— вызывает расчёт и обновляет интерфейс
📝 Формат JSON-файла
{
"total_amount": 1000.0,
"amount_unit": "мл",
"solvent": "Вода",
"reagents": [
{
"name": "NaCl",
"percentage": 0.9,
"unit": "г",
"conversion_factor": 1.0,
"dilution_factor": 1.0
}
]
}
🤝 Вклад в проект
При обнаружении ошибок или наличии предложений создавайте Issue или Pull Request.
📄 Лицензия
MIT License
👨💻 Автор
Artemka
Этот README.md:
- ✅ Кратко описывает функционал
- ✅ Содержит примеры использования
- ✅ Объясняет важную особенность — массовые компоненты не учитываются при расчёте растворителя
- ✅ Даёт подробное описание каждого файла и класса
- 👍 Понятен как новичкам, так и опытным разработчикам