Files
art/main.py
T

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()