Create app.py
Browse files
app.py
ADDED
@@ -0,0 +1,164 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
from kivymd.app import MDApp
|
2 |
+
from kivymd.uix.screen import MDScreen
|
3 |
+
from kivymd.uix.button import MDRaisedButton
|
4 |
+
from kivymd.uix.textfield import MDTextField
|
5 |
+
from kivymd.uix.label import MDLabel
|
6 |
+
from kivymd.uix.boxlayout import MDBoxLayout
|
7 |
+
from kivymd.uix.segmentedcontrol import MDSegmentedControl, MDSegmentedControlItem
|
8 |
+
from kivy.metrics import dp
|
9 |
+
from kivy.properties import StringProperty
|
10 |
+
|
11 |
+
class BMICalculator(MDApp):
|
12 |
+
def build(self):
|
13 |
+
self.theme_cls.primary_palette = "Blue"
|
14 |
+
self.theme_cls.theme_style = "Light"
|
15 |
+
return MainScreen()
|
16 |
+
|
17 |
+
class MainScreen(MDScreen):
|
18 |
+
result_text = StringProperty("")
|
19 |
+
|
20 |
+
def __init__(self, **kwargs):
|
21 |
+
super().__init__(**kwargs)
|
22 |
+
self.setup_ui()
|
23 |
+
|
24 |
+
def setup_ui(self):
|
25 |
+
layout = MDBoxLayout(
|
26 |
+
orientation='vertical',
|
27 |
+
spacing=dp(20),
|
28 |
+
padding=dp(20)
|
29 |
+
)
|
30 |
+
|
31 |
+
# Заголовок
|
32 |
+
title = MDLabel(
|
33 |
+
text="Калькулятор ИМТ",
|
34 |
+
halign="center",
|
35 |
+
font_style="H4",
|
36 |
+
size_hint_y=None,
|
37 |
+
height=dp(80)
|
38 |
+
)
|
39 |
+
layout.add_widget(title)
|
40 |
+
|
41 |
+
# Выбор пола
|
42 |
+
self.gender_control = MDSegmentedControl(
|
43 |
+
size_hint_x=0.9,
|
44 |
+
pos_hint={"center_x": 0.5},
|
45 |
+
size_hint_y=None,
|
46 |
+
height=dp(40)
|
47 |
+
)
|
48 |
+
self.gender_control.add_widget(MDSegmentedControlItem(text="Мужской"))
|
49 |
+
self.gender_control.add_widget(MDSegmentedControlItem(text="Женский"))
|
50 |
+
layout.add_widget(self.gender_control)
|
51 |
+
|
52 |
+
# Поля ввода
|
53 |
+
self.age_input = MDTextField(
|
54 |
+
hint_text="Возраст",
|
55 |
+
helper_text="Введите возраст (лет)",
|
56 |
+
input_filter="int",
|
57 |
+
size_hint_x=0.9,
|
58 |
+
pos_hint={"center_x": 0.5}
|
59 |
+
)
|
60 |
+
layout.add_widget(self.age_input)
|
61 |
+
|
62 |
+
self.height_input = MDTextField(
|
63 |
+
hint_text="Рост",
|
64 |
+
helper_text="Введите рост (см)",
|
65 |
+
input_filter="int",
|
66 |
+
size_hint_x=0.9,
|
67 |
+
pos_hint={"center_x": 0.5}
|
68 |
+
)
|
69 |
+
layout.add_widget(self.height_input)
|
70 |
+
|
71 |
+
self.weight_input = MDTextField(
|
72 |
+
hint_text="Вес",
|
73 |
+
helper_text="Введите вес (кг)",
|
74 |
+
input_filter="float",
|
75 |
+
size_hint_x=0.9,
|
76 |
+
pos_hint={"center_x": 0.5}
|
77 |
+
)
|
78 |
+
layout.add_widget(self.weight_input)
|
79 |
+
|
80 |
+
# Кнопка расчёта
|
81 |
+
calculate_button = MDRaisedButton(
|
82 |
+
text="Рассчитать",
|
83 |
+
pos_hint={"center_x": 0.5},
|
84 |
+
size_hint_x=0.5,
|
85 |
+
on_release=self.calculate_bmi
|
86 |
+
)
|
87 |
+
layout.add_widget(calculate_button)
|
88 |
+
|
89 |
+
# Результаты
|
90 |
+
self.result_label = MDLabel(
|
91 |
+
text="",
|
92 |
+
halign="center",
|
93 |
+
size_hint_y=None,
|
94 |
+
height=dp(200)
|
95 |
+
)
|
96 |
+
layout.add_widget(self.result_label)
|
97 |
+
|
98 |
+
self.add_widget(layout)
|
99 |
+
|
100 |
+
def calculate_bmi(self, instance):
|
101 |
+
try:
|
102 |
+
weight = float(self.weight_input.text)
|
103 |
+
height = float(self.height_input.text) / 100 # конвертируем см в метры
|
104 |
+
age = int(self.age_input.text)
|
105 |
+
gender = "male" if self.gender_control.current_active_segment == 0 else "female"
|
106 |
+
|
107 |
+
# Расчет ИМТ
|
108 |
+
bmi = weight / (height * height)
|
109 |
+
|
110 |
+
# Определение категории ИМТ
|
111 |
+
if bmi < 16:
|
112 |
+
category = "Выраженный дефицит массы тела"
|
113 |
+
recommendations = "Срочно обратитесь к врачу для набора веса"
|
114 |
+
elif 16 <= bmi < 18.5:
|
115 |
+
category = "Недостаточная масса тела"
|
116 |
+
recommendations = "Необходимо увеличить калорийность рациона"
|
117 |
+
elif 18.5 <= bmi < 25:
|
118 |
+
category = "Нормальная масса тела"
|
119 |
+
recommendations = "Продолжайте поддерживать текущий образ жизни"
|
120 |
+
elif 25 <= bmi < 30:
|
121 |
+
category = "Избыточная масса тела"
|
122 |
+
recommendations = "Рекомендуется увеличить физическую активность"
|
123 |
+
elif 30 <= bmi < 35:
|
124 |
+
category = "Ожирение I степени"
|
125 |
+
recommendations = "Необходима консультация диетолога"
|
126 |
+
elif 35 <= bmi < 40:
|
127 |
+
category = "Ожирение II степени"
|
128 |
+
recommendations = "Требуется медицинское вмешательство"
|
129 |
+
else:
|
130 |
+
category = "Ожирение III степени"
|
131 |
+
recommendations = "Срочно ��братитесь к врачу"
|
132 |
+
|
133 |
+
# Расчет идеального веса
|
134 |
+
if gender == "male":
|
135 |
+
ideal_weight = round(50 + 2.3 * ((height * 100 * 0.4) - 60), 1)
|
136 |
+
else:
|
137 |
+
ideal_weight = round(45.5 + 2.3 * ((height * 100 * 0.4) - 60), 1)
|
138 |
+
|
139 |
+
# Расчет базового обмена веществ (BMR)
|
140 |
+
if gender == "male":
|
141 |
+
bmr = round(88.36 + (13.4 * weight) + (4.8 * height * 100) - (5.7 * age))
|
142 |
+
else:
|
143 |
+
bmr = round(447.6 + (9.2 * weight) + (3.1 * height * 100) - (4.3 * age))
|
144 |
+
|
145 |
+
result_text = f"""ИМТ: {bmi:.1f}
|
146 |
+
Категория: {category}
|
147 |
+
Идеальный вес: {ideal_weight} кг
|
148 |
+
Базовый обмен веществ: {bmr} ккал/день
|
149 |
+
|
150 |
+
Рекомендации:
|
151 |
+
{recommendations}
|
152 |
+
|
153 |
+
Для поддержания веса необходимо:
|
154 |
+
Малоподвижный образ жизни: {int(bmr * 1.2)} ккал
|
155 |
+
Умеренная активность: {int(bmr * 1.375)} ккал
|
156 |
+
Высокая активность: {int(bmr * 1.55)} ккал"""
|
157 |
+
|
158 |
+
self.result_label.text = result_text
|
159 |
+
|
160 |
+
except ValueError:
|
161 |
+
self.result_label.text = "Пожалуйста, заполните все поля корректно"
|
162 |
+
|
163 |
+
if __name__ == '__main__':
|
164 |
+
BMICalculator().run()
|