import sys import json import base64 import requests from time import sleep from PyQt6.QtWidgets import (QApplication, QMainWindow, QWidget, QVBoxLayout, QHBoxLayout, QLabel, QLineEdit, QPushButton, QComboBox, QSpinBox, QDoubleSpinBox, QProgressBar, QScrollArea, QTextEdit, QFileDialog, QMenuBar, QMenu) from PyQt6.QtCore import Qt, QThread, pyqtSignal, QTimer from PyQt6.QtGui import QPixmap, QImage, QAction, QFontDatabase, QFont from PIL import Image from io import BytesIO from pathlib import Path # Импортируем новые модули from modules.console_window import ConsoleWindow from modules.model_manager import ModelManager from modules.sampler_manager import SamplerManager from modules.prompt_window import PromptWindow from modules.negative_prompt_window import NegativePromptWindow from modules.size_preset_manager import SizePresetManager from modules.settings_menu import SettingsMenu from modules.styles.base_window import BaseWindow from modules.styles.navigation import NavigationPanel from modules.styles.page import PageContainer from modules.pages.home_page import HomePage from modules.pages.models_page import ModelsPage from modules.pages.settings_page import SettingsPage from scripts.download_resources import download_font class GenerationThread(QThread): progress_updated = pyqtSignal(float, str) generation_complete = pyqtSignal(list) error_occurred = pyqtSignal(str) def __init__(self, api_url, params): super().__init__() self.api_url = api_url self.params = params self.is_generating = False def run(self): try: self.is_generating = True self.progress_updated.emit(0, "Начало генерации...") # Отправляем запрос на генерацию response = requests.post(f"{self.api_url}/sdapi/v1/txt2img", json=self.params) if response.status_code != 200: self.error_occurred.emit(f"Ошибка API: {response.status_code}") return # Получаем результат result = response.json() images = result.get('images', []) if not images: self.error_occurred.emit("Не удалось получить изображения") return self.generation_complete.emit(images) except Exception as e: self.error_occurred.emit(f"Ошибка: {str(e)}") finally: self.is_generating = False def stop(self): self.is_generating = False class MainWindow(BaseWindow): def __init__(self): super().__init__() self.setWindowTitle("Stable Diffusion UI") self.setMinimumSize(1200, 800) self.setup_ui() def create_horizontal_layout(self): """Создает горизонтальный layout для главного окна""" central_widget = QWidget() self.setCentralWidget(central_widget) layout = QHBoxLayout(central_widget) layout.setContentsMargins(0, 0, 0, 0) layout.setSpacing(0) return layout def setup_ui(self): # Загружаем шрифт font_path = Path("resources/fonts/InterVariable.ttf") if not font_path.exists(): download_font() font_id = QFontDatabase.addApplicationFont(str(font_path)) if font_id != -1: font_family = QFontDatabase.applicationFontFamilies(font_id)[0] app_font = QFont(font_family) QApplication.setFont(app_font) # Создаем горизонтальный layout layout = self.create_horizontal_layout() # Добавляем навигационную панель self.nav_panel = NavigationPanel() layout.addWidget(self.nav_panel) # Создаем контейнер для страниц self.page_container = PageContainer() layout.addWidget(self.page_container) # Добавляем страницы self.home_page = HomePage() self.models_page = ModelsPage() self.settings_page = SettingsPage() self.page_container.add_page("home", self.home_page) self.page_container.add_page("models", self.models_page) self.page_container.add_page("settings", self.settings_page) # Подключаем сигнал смены страницы self.nav_panel.page_changed.connect(self.switch_page) # Показываем домашнюю страницу по умолчанию self.page_container.show_page("home") def switch_page(self, page_name): self.page_container.show_page(page_name) def main(): app = QApplication(sys.argv) window = MainWindow() window.show() sys.exit(app.exec()) if __name__ == "__main__": main()