|
from kivymd.app import MDApp |
|
from kivymd.uix.screen import MDScreen |
|
from kivymd.uix.button import MDRaisedButton |
|
from kivymd.uix.textfield import MDTextField |
|
from kivymd.uix.label import MDLabel |
|
from kivymd.uix.boxlayout import MDBoxLayout |
|
from kivymd.uix.segmentedcontrol import MDSegmentedControl, MDSegmentedControlItem |
|
from kivy.metrics import dp |
|
from kivy.properties import StringProperty |
|
|
|
class BMICalculator(MDApp): |
|
def build(self): |
|
self.theme_cls.primary_palette = "Blue" |
|
self.theme_cls.theme_style = "Light" |
|
return MainScreen() |
|
|
|
class MainScreen(MDScreen): |
|
result_text = StringProperty("") |
|
|
|
def __init__(self, **kwargs): |
|
super().__init__(**kwargs) |
|
self.setup_ui() |
|
|
|
def setup_ui(self): |
|
layout = MDBoxLayout( |
|
orientation='vertical', |
|
spacing=dp(20), |
|
padding=dp(20) |
|
) |
|
|
|
|
|
title = MDLabel( |
|
text="Калькулятор ИМТ", |
|
halign="center", |
|
font_style="H4", |
|
size_hint_y=None, |
|
height=dp(80) |
|
) |
|
layout.add_widget(title) |
|
|
|
|
|
self.gender_control = MDSegmentedControl( |
|
size_hint_x=0.9, |
|
pos_hint={"center_x": 0.5}, |
|
size_hint_y=None, |
|
height=dp(40) |
|
) |
|
self.gender_control.add_widget(MDSegmentedControlItem(text="Мужской")) |
|
self.gender_control.add_widget(MDSegmentedControlItem(text="Женский")) |
|
layout.add_widget(self.gender_control) |
|
|
|
|
|
self.age_input = MDTextField( |
|
hint_text="Возраст", |
|
helper_text="Введите возраст (лет)", |
|
input_filter="int", |
|
size_hint_x=0.9, |
|
pos_hint={"center_x": 0.5} |
|
) |
|
layout.add_widget(self.age_input) |
|
|
|
self.height_input = MDTextField( |
|
hint_text="Рост", |
|
helper_text="Введите рост (см)", |
|
input_filter="int", |
|
size_hint_x=0.9, |
|
pos_hint={"center_x": 0.5} |
|
) |
|
layout.add_widget(self.height_input) |
|
|
|
self.weight_input = MDTextField( |
|
hint_text="Вес", |
|
helper_text="Введите вес (кг)", |
|
input_filter="float", |
|
size_hint_x=0.9, |
|
pos_hint={"center_x": 0.5} |
|
) |
|
layout.add_widget(self.weight_input) |
|
|
|
|
|
calculate_button = MDRaisedButton( |
|
text="Рассчитать", |
|
pos_hint={"center_x": 0.5}, |
|
size_hint_x=0.5, |
|
on_release=self.calculate_bmi |
|
) |
|
layout.add_widget(calculate_button) |
|
|
|
|
|
self.result_label = MDLabel( |
|
text="", |
|
halign="center", |
|
size_hint_y=None, |
|
height=dp(200) |
|
) |
|
layout.add_widget(self.result_label) |
|
|
|
self.add_widget(layout) |
|
|
|
def calculate_bmi(self, instance): |
|
try: |
|
weight = float(self.weight_input.text) |
|
height = float(self.height_input.text) / 100 |
|
age = int(self.age_input.text) |
|
gender = "male" if self.gender_control.current_active_segment == 0 else "female" |
|
|
|
|
|
bmi = weight / (height * height) |
|
|
|
|
|
if bmi < 16: |
|
category = "Выраженный дефицит массы тела" |
|
recommendations = "Срочно обратитесь к врачу для набора веса" |
|
elif 16 <= bmi < 18.5: |
|
category = "Недостаточная масса тела" |
|
recommendations = "Необходимо увеличить калорийность рациона" |
|
elif 18.5 <= bmi < 25: |
|
category = "Нормальная масса тела" |
|
recommendations = "Продолжайте поддерживать текущий образ жизни" |
|
elif 25 <= bmi < 30: |
|
category = "Избыточная масса тела" |
|
recommendations = "Рекомендуется увеличить физическую активность" |
|
elif 30 <= bmi < 35: |
|
category = "Ожирение I степени" |
|
recommendations = "Необходима консультация диетолога" |
|
elif 35 <= bmi < 40: |
|
category = "Ожирение II степени" |
|
recommendations = "Требуется медицинское вмешательство" |
|
else: |
|
category = "Ожирение III степени" |
|
recommendations = "Срочно обратитесь к врачу" |
|
|
|
|
|
if gender == "male": |
|
ideal_weight = round(50 + 2.3 * ((height * 100 * 0.4) - 60), 1) |
|
else: |
|
ideal_weight = round(45.5 + 2.3 * ((height * 100 * 0.4) - 60), 1) |
|
|
|
|
|
if gender == "male": |
|
bmr = round(88.36 + (13.4 * weight) + (4.8 * height * 100) - (5.7 * age)) |
|
else: |
|
bmr = round(447.6 + (9.2 * weight) + (3.1 * height * 100) - (4.3 * age)) |
|
|
|
result_text = f"""ИМТ: {bmi:.1f} |
|
Категория: {category} |
|
Идеальный вес: {ideal_weight} кг |
|
Базовый обмен веществ: {bmr} ккал/день |
|
|
|
Рекомендации: |
|
{recommendations} |
|
|
|
Для поддержания веса необходимо: |
|
Малоподвижный образ жизни: {int(bmr * 1.2)} ккал |
|
Умеренная активность: {int(bmr * 1.375)} ккал |
|
Высокая активность: {int(bmr * 1.55)} ккал""" |
|
|
|
self.result_label.text = result_text |
|
|
|
except ValueError: |
|
self.result_label.text = "Пожалуйста, заполните все поля корректно" |
|
|
|
if __name__ == '__main__': |
|
BMICalculator().run() |