| 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() |