add scrolling:
class TrainApp(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle('Обучение модели предсказания импеданса')
        layout = QVBoxLayout()

        form_layout = QFormLayout()
        self.x_data_path_line_edit = QLineEdit()
        self.y_data_path_line_edit = QLineEdit()
        self.wells_data_path_line_edit = QLineEdit()
        self.val_wellnames_list_widget = QListWidget()
        self.train_wellnames_list_widget = QListWidget()
        self.save_path_line_edit = QLineEdit()
        self.n_epochs_spin_box = QSpinBox(value=50)
        self.patch_size_spin_box = QSpinBox(value=128)
        self.batch_size_spin_box = QSpinBox(value=32)
        self.os_size_spin_box = QSpinBox(value=64)
        self.val_size_spin_box = QSpinBox(value=100)
        self.learning_rate_double_spin_box = QDoubleSpinBox(value=1e-4, decimals=6)
        self.global_loss_coef_double_spin_box = QDoubleSpinBox(value=0.05, decimals=6)
        self.train_wavelet_mode_combo_box = QComboBox()
        self.train_wavelet_mode_combo_box.addItems(WAVELET_TRAINING_OPTIONS.keys())
        self.wavelet_freq_double_spin_box = QDoubleSpinBox(value=10)
        self.wavelet_length_double_spin_box = QDoubleSpinBox(value=0.128, decimals=6)
        self.wavelet_dt_double_spin_box = QDoubleSpinBox(value=0.004, decimals=6)
        self.max_n_wells_on_plot_spin_box = QSpinBox(value=0)
        self.training_axes_combo_box = QComboBox()
        self.training_axes_combo_box.addItems(['0', '1'])
        self.clearml_project_name_line_edit = QLineEdit()

        form_layout.addRow('Имя файла датасете (x_data):', self.x_data_path_line_edit)
        select_x_data_file_button = QPushButton('Выбрать файл x_data')
        select_x_data_file_button.clicked.connect(lambda: self.select_file(self.x_data_path_line_edit, ext_filter="*.npy"))
        form_layout.addRow(select_x_data_file_button)
        form_layout.addRow(QLabel('Имя файла импеданса (y_data)'), self.y_data_path_line_edit)
        select_y_data_file_button = QPushButton('Выбрать файл y_data')
        select_y_data_file_button.clicked.connect(lambda: self.select_file(self.y_data_path_line_edit, ext_filter="*.npy"))
        form_layout.addRow(select_y_data_file_button)
        form_layout.addRow(QLabel('Имя файла скважин (wells_data)'), self.wells_data_path_line_edit)
        select_wells_data_file_button = QPushButton('Выбрать файл скважин (wells_data)')
        select_wells_data_file_button.clicked.connect(lambda: self.select_file(self.wells_data_path_line_edit, ext_filter="*.pickle"))
        form_layout.addRow(select_wells_data_file_button)
        form_layout.addRow('Валидационные скважины:', self.val_wellnames_list_widget)
        form_layout.addRow('Обучающие скважины:', self.train_wellnames_list_widget)
        form_layout.addRow(QLabel('Путь для сохранения весов модели'), self.save_path_line_edit)
        select_save_path_button = QPushButton('Выбрать путь для сохранения')
        select_save_path_button.clicked.connect(lambda: self.select_directory(self.save_path_line_edit))
        form_layout.addRow(select_save_path_button)
        form_layout.addRow('Количество эпох обучения', self.n_epochs_spin_box)
        form_layout.addRow('patch_size', self.patch_size_spin_box)
        form_layout.addRow('batch_size', self.batch_size_spin_box)
        form_layout.addRow('os_size', self.os_size_spin_box)
        form_layout.addRow('val_size', self.val_size_spin_box)
        form_layout.addRow(QLabel('learning_rate'), self.learning_rate_double_spin_box)
        form_layout.addRow('global_loss_coef', self.global_loss_coef_double_spin_box)
        form_layout.addRow(QLabel('Режим обучения импульса'), self.train_wavelet_mode_combo_box)
        form_layout.addRow('wavelet_freq', self.wavelet_freq_double_spin_box)
        form_layout.addRow('wavelet_length', self.wavelet_length_double_spin_box)
        form_layout.addRow('wavelet_dt', self.wavelet_dt_double_spin_box)
        form_layout.addRow(QLabel('Максимальное количество скважин на рисунке'), self.max_n_wells_on_plot_spin_box)
        form_layout.addRow(QLabel('Выбрать ось куба для обучения'), self.training_axes_combo_box)
        form_layout.addRow('Имя проекта для сохранения в ClearML', self.clearml_project_name_line_edit)

        layout.addLayout(form_layout)
        run_button = QPushButton('Начать обучение')
        run_button.clicked.connect(self.start_training)
        layout.addWidget(run_button)



        self.setLayout(layout)