Слегка упрощенный код программы для рандомного составления тренировок, с убранным дизайном и комментариями. Сократил, чтобы кодом влезло :)



Все, что нужно доделать - графическую часть интерфейса, какая вам понравится, и файл 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()