Слегка упрощенный код программы для рандомного составления тренировок, с убранным дизайном и комментариями. Сократил, чтобы кодом влезло :)
Все, что нужно доделать - графическую часть интерфейса, какая вам понравится, и файл exercises.json (приложил шаблон в комментарии) с перечнем упражнений, который должен быть в той же директории, что и скрипт.
Все, что нужно доделать - графическую часть интерфейса, какая вам понравится, и файл exercises.json (приложил шаблон в комментарии) с перечнем упражнений, который должен быть в той же директории, что и скрипт.
import sys
import json
import random
import os
from PyQt5.QtWidgets import (
QApplication, QWidget, QLabel, QPushButton, QVBoxLayout,
QHBoxLayout, QComboBox, QMessageBox, QTextEdit
)
from PyQt5.QtGui import QFont, QIcon
from PyQt5.QtCore import Qt
class WorkoutGenerator(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle("Генератор Тренировок")
self.setGeometry(100, 100, 600, 400)
self.exercises = {}
self.load_data()
self.init_ui()
def load_data(self):
try:
with open('exercises.json', 'r', encoding='utf-8') as file:
self.exercises = json.load(file)
except Exception as e:
QMessageBox.critical(self, "Ошибка", f"Ошибка загрузки данных: {str(e)}")
sys.exit(1)
def init_ui(self):
main_layout = QVBoxLayout()
title_label = QLabel("Генератор Случайной Тренировки")
title_label.setFont(QFont("Arial", 18, QFont.Bold))
title_label.setAlignment(Qt.AlignCenter)
main_layout.addWidget(title_label)
intensity_layout = QHBoxLayout()
intensity_label = QLabel("Интенсивность:")
self.intensity_combo = QComboBox()
self.intensity_combo.addItems(["Легкая", "Средняя", "Тяжелая"])
intensity_layout.addWidget(intensity_label)
intensity_layout.addWidget(self.intensity_combo)
main_layout.addLayout(intensity_layout)
muscle_layout = QHBoxLayout()
muscle_label = QLabel("Мышечная группа:")
self.muscle_combo = QComboBox()
muscle_groups = [
"Бицепс", "Трицепс", "Бицепс бедра", "Квадрицепс",
"Ягодицы", "Пресс", "Грудные мышцы", "Спина", "Плечи"
]
self.muscle_combo.addItems(muscle_groups)
muscle_layout.addWidget(muscle_label)
muscle_layout.addWidget(self.muscle_combo)
main_layout.addLayout(muscle_layout)
generate_button = QPushButton("Сгенерировать тренировку")
generate_button.clicked.connect(self.generate_workout)
main_layout.addWidget(generate_button)
self.result_text = QTextEdit()
self.result_text.setReadOnly(True)
main_layout.addWidget(self.result_text)
self.setLayout(main_layout)
def generate_workout(self):
intensity = self.intensity_combo.currentText()
muscle_group = self.muscle_combo.currentText().lower()
mapping = {
"бицепс": "biceps",
"трицепс": "triceps",
"бицепс бедра": "hamstrings",
#другие параметры
}
key = mapping.get(muscle_group)
if not key or key not in self.exercises:
QMessageBox.warning(self, "Ошибка", "Нет данных для выбранной группы мышц.")
return
basic_ex = self.exercises[key].get('basic', [])
isolation_ex = self.exercises[key].get('isolation', [])
num_exercises = {
"Легкая": 2,
"Средняя": 3,
"Тяжелая": 4
}.get(intensity, 2)
num_basic = 2
num_isolation = num_exercises - num_basic
selected_basic = random.sample(basic_ex, min(num_basic, len(basic_ex)))
selected_isolation = random.sample(isolation_ex, min(num_isolation, len(isolation_ex)))
workout = selected_basic + selected_isolation
workout_str = "Ваше предложение для тренировки:\n"
for idx, exercise in enumerate(workout, 1):
workout_str += f"{idx}. {exercise}\n"
self.result_text.setPlainText(workout_str)
def main():
app = QApplication(sys.argv)
window = WorkoutGenerator()
window.show()
sys.exit(app.exec_())
if __name__ == "__main__":
main()