Untitled
import tkinter as tk from tkinter import ttk, messagebox from PIL import Image, ImageTk import sqlite3 # configure la base de données def setup_database(): conn = sqlite3.connect("db.sqlite") cursor = conn.cursor() # crée les tables si elles n'existent pas cursor.execute(""" CREATE TABLE IF NOT EXISTS articles ( id INTEGER PRIMARY KEY, categorie TEXT, nom TEXT, couleur TEXT, tailles TEXT, prix REAL, quantite INTEGER, image_path TEXT ) """) cursor.execute(""" CREATE TABLE IF NOT EXISTS commandes ( id INTEGER PRIMARY KEY, nom_client TEXT, prenom_client TEXT, adresse TEXT, telephone TEXT, article_id INTEGER, quantite INTEGER, FOREIGN KEY (article_id) REFERENCES articles (id) ) """) # si la table des articles est vide, ajoute des articles par défaut cursor.execute("SELECT COUNT(*) FROM articles") if cursor.fetchone()[0] == 0: articles = [ ("Pulls", "Pull en laine", "blanc cassé", "S,M,L,XL", 49.99, 20, "images/pull_laine.png"), ("Pulls", "Pull col V", "Beige", "M,L", 39.99, 15, "images/pull_col_v.png"), ("Pantalons", "Jean slim", "bleu ciel", "S,M,L", 59.99, 10, "images/jean_slim.png"), ("Pantalons", "Pantalon cargo", "Kaki", "M,L,XL", 69.99, 8, "images/pantalon_cargo.png"), ("Tee shirts", "T-shirt uni", "Blanc", "S,M,L,XL", 19.99, 30, "images/tshirt_uni.png"), ("Tee shirts", "T-shirt imprimé", "Noir, or", "M,L", 24.99, 25, "images/tshirt_imprime.png") ] cursor.executemany(""" INSERT INTO articles (categorie, nom, couleur, tailles, prix, quantite, image_path) VALUES (?, ?, ?, ?, ?, ?, ?) """, articles) conn.commit() conn.close() # récupère les articles d'une catégorie def get_articles_by_category(categorie): conn = sqlite3.connect("db.sqlite") cursor = conn.cursor() cursor.execute("SELECT * FROM articles WHERE categorie = ?", (categorie,)) articles = cursor.fetchall() conn.close() return articles # classe principale de l'application class BoutiqueApp: def __init__(self, root): self.root = root self.root.title("Flo et Ismaïl") # crée les onglets pour chaque catégorie self.tab_control = ttk.Notebook(root) self.tabs = {} for category in ["Pulls", "Pantalons", "Tee shirts"]: tab = ttk.Frame(self.tab_control) self.tab_control.add(tab, text=category) self.tabs[category] = tab self.tab_control.pack(expand=1, fill="both") # affiche les articles pour chaque catégorie for category in self.tabs: self.display_articles(category, self.tabs[category]) self.create_order_form() # affiche les articles d'une catégorie def display_articles(self, category, frame): articles = get_articles_by_category(category) for idx, article in enumerate(articles): try: # charge l'image de l'article image = Image.open(article[7]) image = image.resize((100, 100), Image.LANCZOS) photo = ImageTk.PhotoImage(image) except Exception as e: print(f"{article[2]}: {e}") photo = None if photo: image_label = tk.Label(frame, image=photo) image_label.image = photo image_label.grid(row=idx, column=0, padx=10, pady=5) # affiche les infos de l'article article_label = tk.Label(frame, text=f"{article[2]} - {article[3]} - {article[4]} - {article[5]}€ - Stock: {article[6]}") article_label.grid(row=idx, column=1, padx=10, pady=5, sticky="w") # bouton pour commander order_button = tk.Button(frame, text="Commander", command=lambda a=article: self.open_order_form(a)) order_button.grid(row=idx, column=2, padx=10, pady=5) # crée le formulaire de commande def create_order_form(self): self.order_form = tk.Toplevel(self.root) self.order_form.title("Commander") self.order_form.geometry("400x300") self.order_form.withdraw() # champs pour la commande tk.Label(self.order_form, text="Nom:").grid(row=0, column=0, padx=10, pady=5) self.nom_entry = tk.Entry(self.order_form) self.nom_entry.grid(row=0, column=1, padx=10, pady=5) tk.Label(self.order_form, text="Prénom:").grid(row=1, column=0, padx=10, pady=5) self.prenom_entry = tk.Entry(self.order_form) self.prenom_entry.grid(row=1, column=1, padx=10, pady=5) tk.Label(self.order_form, text="Adresse:").grid(row=2, column=0, padx=10, pady=5) self.adresse_entry = tk.Entry(self.order_form) self.adresse_entry.grid(row=2, column=1, padx=10, pady=5) tk.Label(self.order_form, text="Numéro:").grid(row=3, column=0, padx=10, pady=5) self.telephone_entry = tk.Entry(self.order_form) self.telephone_entry.grid(row=3, column=1, padx=10, pady=5) tk.Label(self.order_form, text="Quantité:").grid(row=4, column=0, padx=10, pady=5) self.quantite_spinbox = tk.Spinbox(self.order_form, from_=1, to=10, width=5) self.quantite_spinbox.grid(row=4, column=1, padx=10, pady=5) self.selected_article = None self.confirm_button = tk.Button(self.order_form, text="Confirmer", command=self.submit_order) self.confirm_button.grid(row=5, column=0, columnspan=2, pady=20) # ouvre le formulaire avec l'article sélectionné def open_order_form(self, article): self.selected_article = article self.order_form.deiconify() # soumet la commande après vérification def submit_order(self): nom = self.nom_entry.get() prenom = self.prenom_entry.get() adresse = self.adresse_entry.get() telephone = self.telephone_entry.get() quantite = int(self.quantite_spinbox.get()) # vérifie les champs if not all([nom, prenom, adresse, telephone]): messagebox.showerror("Erreur", "Tous les champs doivent être remplis.") return # vérifie le stock if self.selected_article[6] < quantite: messagebox.showerror("Erreur", "Stock insuffisant.") return # met à jour les données self.update_stock_and_orders(nom, prenom, adresse, telephone, quantite) # met à jour le stock et enregistre la commande def update_stock_and_orders(self, nom, prenom, adresse, telephone, quantite): conn = sqlite3.connect("db.sqlite") cursor = conn.cursor() cursor.execute(""" INSERT INTO commandes (nom_client, prenom_client, adresse, telephone, article_id, quantite) VALUES (?, ?, ?, ?, ?, ?) """, (nom, prenom, adresse, telephone, self.selected_article[0], quantite)) cursor.execute(""" UPDATE articles SET quantite = quantite - ? WHERE id = ? """, (quantite, self.selected_article[0])) conn.commit() conn.close() messagebox.showinfo("Merci", "Commande validée !") self.order_form.withdraw() if __name__ == "__main__": setup_database() # initialise la base de données root = tk.Tk() app = BoutiqueApp(root) # lance l'application root.mainloop()
Leave a Comment