File size: 7,960 Bytes
379af61 9df7ee3 379af61 9df7ee3 379af61 9df7ee3 379af61 9df7ee3 379af61 9df7ee3 379af61 9df7ee3 379af61 9df7ee3 379af61 9df7ee3 379af61 9df7ee3 379af61 bc0238f 379af61 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 |
import tkinter as tk
from tkinter import ttk, scrolledtext, messagebox
from PIL import Image, ImageTk
import os
from datetime import datetime
import json
import requests
from io import BytesIO
import base64
import time
class DrawingTutorialApp:
def __init__(self, root):
self.root = root
self.root.title("Générateur de Tutoriel de Dessin")
# Configuration de l'API Hugging Face
self.API_URL = "https://api-inference.huggingface.co/models/stabilityai/sdxl-turbo"
# Remplacez par votre token
# Configuration des styles
self.setup_styles()
# Variables
self.current_step = 0
self.generated_images = []
self.steps_description = []
# Création de l'interface
self.create_interface()
def setup_styles(self):
style = ttk.Style()
style.configure('TButton', padding=5)
style.configure('TFrame', padding=5)
def create_interface(self):
# Frame principal
main_frame = ttk.Frame(self.root)
main_frame.pack(expand=True, fill='both', padx=10, pady=10)
# Zone de description
desc_frame = ttk.LabelFrame(main_frame, text="Description du dessin")
desc_frame.pack(fill='x', pady=5)
self.description_text = scrolledtext.ScrolledText(desc_frame, height=4)
self.description_text.pack(fill='x', padx=5, pady=5)
# Boutons de contrôle
control_frame = ttk.Frame(main_frame)
control_frame.pack(fill='x', pady=5)
ttk.Button(control_frame, text="Générer les étapes",
command=self.generate_steps).pack(side='left', padx=5)
ttk.Button(control_frame, text="Étape précédente",
command=self.previous_step).pack(side='left', padx=5)
ttk.Button(control_frame, text="Étape suivante",
command=self.next_step).pack(side='left', padx=5)
# Zone d'affichage
self.display_frame = ttk.LabelFrame(main_frame, text="Aperçu de l'étape")
self.display_frame.pack(fill='both', expand=True, pady=5)
self.image_label = ttk.Label(self.display_frame)
self.image_label.pack(padx=5, pady=5)
# Zone de description des étapes
self.step_description = ttk.Label(self.display_frame,
text="Aucune étape générée",
wraplength=400)
self.step_description.pack(padx=5, pady=5)
# Indicateur de progression
self.progress_label = ttk.Label(main_frame, text="")
self.progress_label.pack(pady=5)
def query_image(self, prompt):
"""Génère une image via l'API Hugging Face"""
try:
response = requests.post(
self.API_URL,
headers=self.headers,
json={
"inputs": prompt,
"parameters": {
"num_inference_steps": 1,
"guidance_scale": 0.0,
}
}
)
# Vérifier si la requête a réussi
if response.status_code != 200:
raise Exception(f"Erreur API: {response.status_code}")
# Vérifier si le modèle est en cours de chargement
if response.status_code == 200 and "error" in response.json():
if "currently loading" in response.json()["error"]:
print("Modèle en cours de chargement, attente...")
time.sleep(20) # Attendre et réessayer
return self.query_image(prompt)
# Traiter la réponse
image_bytes = response.content
image = Image.open(BytesIO(image_bytes))
return image
except Exception as e:
print(f"Erreur lors de la génération d'image: {e}")
messagebox.showerror("Erreur", f"Erreur lors de la génération d'image: {e}")
return None
def generate_steps(self):
description = self.description_text.get("1.0", "end-1c")
if not description:
messagebox.showwarning("Attention", "Veuillez entrer une description")
return
# Définition des étapes et prompts associés
steps = [
{
"name": "Esquisse de base et formes géométriques",
"prompt": f"basic sketch with geometric shapes of {description}, lineart, sketch style, black and white"
},
{
"name": "Ajout des détails principaux",
"prompt": f"detailed sketch of {description}, more defined lines, black and white drawing"
},
{
"name": "Affinement des lignes",
"prompt": f"refined line drawing of {description}, clean lines, professional sketch"
},
{
"name": "Ajout des ombres de base",
"prompt": f"shaded sketch of {description}, basic shadows and values, grayscale"
},
{
"name": "Colorisation de base",
"prompt": f"basic colored version of {description}, flat colors, simple coloring"
},
{
"name": "Ajout des détails de couleur",
"prompt": f"detailed colored drawing of {description}, with shading and color details"
},
{
"name": "Finalisation et mise en valeur",
"prompt": f"final polished illustration of {description}, complete with details and professional finish"
}
]
# Réinitialisation des listes
self.generated_images = []
self.steps_description = []
# Génération des images pour chaque étape
for i, step in enumerate(steps):
self.progress_label.configure(
text=f"Génération de l'étape {i+1}/{len(steps)}: {step['name']}")
self.root.update()
image = self.query_image(step['prompt'])
if image:
self.generated_images.append(image)
self.steps_description.append(f"{step['name']}\n{step['prompt']}")
else:
messagebox.showerror("Erreur", f"Échec de la génération pour l'étape {i+1}")
continue
if self.generated_images:
self.progress_label.configure(text="Génération terminée!")
self.current_step = 0
self.update_display()
else:
self.progress_label.configure(text="Échec de la génération")
def update_display(self):
if not self.generated_images:
return
image = self.generated_images[self.current_step]
# Redimensionner l'image si nécessaire
image = image.resize((400, 400), Image.Resampling.LANCZOS)
photo = ImageTk.PhotoImage(image)
self.image_label.configure(image=photo)
self.image_label.image = photo
step_text = f"Étape {self.current_step + 1}/{len(self.generated_images)}\n"
step_text += self.steps_description[self.current_step]
self.step_description.configure(text=step_text)
def previous_step(self):
if self.current_step > 0:
self.current_step -= 1
self.update_display()
def next_step(self):
if self.current_step < len(self.generated_images) - 1:
self.current_step += 1
self.update_display()
def main():
root = tk.Tk()
app = DrawingTutorialApp(root)
root.mainloop()
if __name__ == "__main__":
main() |