Serg4451D commited on
Commit
b25f974
·
verified ·
1 Parent(s): a269330

Create app.py

Browse files
Files changed (1) hide show
  1. app.py +164 -0
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()