135 lines
5.0 KiB
Python
135 lines
5.0 KiB
Python
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() |