Загрузка данных


import tkinter as tk
from tkinter import ttk
from database import Database

class ProductsView:
    def __init__(self, parent, user):
        self.parent = parent
        self.user = user
        self.db = Database()

        # Главный фрейм страницы
        self.window = tk.Frame(parent, bg="#FFFFFF")
        self.window.pack(fill=tk.BOTH, expand=True)

        tk.Label(self.window, text="Каталог товаров", font=("Arial", 14, "bold"), bg="#FFFFFF").pack(pady=10)

        # Контейнер для прокрутки
        container = tk.Frame(self.window, bg="#FFFFFF")
        container.pack(fill=tk.BOTH, expand=True, padx=10, pady=5)

        # Холст (Canvas) позволяет прокручивать содержимое внутри него
        self.canvas = tk.Canvas(container, bg="#FFFFFF", highlightthickness=0)
        scrollbar = ttk.Scrollbar(container, orient=tk.VERTICAL, command=self.canvas.yview)
        
        # Внутренний фрейм, куда будут складываться карточки
        self.scrollable_frame = tk.Frame(self.canvas, bg="#FFFFFF")
        self.scrollable_frame.bind(
            "<Configure>",
            lambda e: self.canvas.configure(scrollregion=self.canvas.bbox("all"))
        )

        self.canvas_frame_id = self.canvas.create_window((0, 0), window=self.scrollable_frame, anchor="nw")
        
        # Растягиваем карточки по ширине экрана
        self.canvas.bind('<Configure>', lambda event: self.canvas.itemconfigure(self.canvas_frame_id, width=event.width))
        self.canvas.configure(yscrollcommand=scrollbar.set)

        self.canvas.pack(side=tk.LEFT, fill=tk.BOTH, expand=True)
        scrollbar.pack(side=tk.RIGHT, fill=tk.Y)

        # Привязка колесика мыши для удобного скроллинга
        self.canvas.bind_all("<MouseWheel>", lambda event: self.canvas.yview_scroll(int(-1 * (event.delta / 120)), "units"))

        self.load_products_cards()

    def load_products_cards(self):
        # Очищаем старые данные
        for widget in self.scrollable_frame.winfo_children():
            widget.destroy()

        products = self.db.get_all_products()

        for p in products:
            try: discount = float(p.discount.replace('%', '').strip())
            except: discount = 0.0
            
            try: qty = float(p.quantity.strip())
            except: qty = 0.0

            # Практика 5: Установка цветов фона и текста
            if qty == 0:
                bg_color = "#ADD8E6" # Голубой
                fg_color = "black"
            elif discount > 10:
                bg_color = "#2E8B57" # Зеленый
                fg_color = "white"   # Белый текст для читаемости на темном фоне
            else:
                bg_color = "#FFFFFF" # Белый
                fg_color = "black"

            # Внешняя рамка карточки (Solid border)
            card_frame = tk.Frame(self.scrollable_frame, bg=bg_color, bd=2, relief=tk.SOLID)
            card_frame.pack(fill=tk.X, padx=10, pady=5, ipady=5)

            # --- ЛЕВАЯ ЧАСТЬ: Фото ---
            img_container = tk.Frame(card_frame, width=120, height=120, bg="#FFFFFF", bd=1, relief=tk.SOLID)
            img_container.pack(side=tk.LEFT, padx=15, pady=10)
            img_container.pack_propagate(False)

            img_file = p.photo if p.photo else "picture.png"
            try:
                img = tk.PhotoImage(file=img_file).subsample(2, 2)
                img_lbl = tk.Label(img_container, image=img, bg="#FFFFFF")
                img_lbl.image = img
                img_lbl.pack(fill=tk.BOTH, expand=True)
            except Exception:
                tk.Label(img_container, text="picture.png", font=("Arial", 9), bg="#FFFFFF", fg="black").pack(fill=tk.BOTH, expand=True)

            # --- ЦЕНТРАЛЬНАЯ ЧАСТЬ: Информация строго по Практике 4 ---
            info_frame = tk.Frame(card_frame, bg=bg_color)
            info_frame.pack(side=tk.LEFT, fill=tk.BOTH, expand=True, padx=15, pady=10)

            tk.Label(info_frame, text=f"{p.category} | {p.name}", font=("Arial", 12, "bold"), bg=bg_color, fg=fg_color).pack(anchor=tk.W)
            tk.Label(info_frame, text=f"Описание товара: {p.description}", font=("Arial", 9), bg=bg_color, fg=fg_color, wraplength=450, justify=tk.LEFT).pack(anchor=tk.W, pady=2)
            tk.Label(info_frame, text=f"Производитель: {p.manufacturer}", font=("Arial", 9), bg=bg_color, fg=fg_color).pack(anchor=tk.W)
            tk.Label(info_frame, text=f"Поставщик: {p.supplier}", font=("Arial", 9), bg=bg_color, fg=fg_color).pack(anchor=tk.W)
            
            # Строка с ценой
            price_frame = tk.Frame(info_frame, bg=bg_color)
            price_frame.pack(anchor=tk.W, pady=2)
            tk.Label(price_frame, text="Цена: ", font=("Arial", 9), bg=bg_color, fg=fg_color).pack(side=tk.LEFT)

            if discount > 0:
                try:
                    old_price = float(p.price)
                    new_price = old_price * (1 - discount / 100)
                    tk.Label(price_frame, text=f"{old_price} руб.", fg="red", font=("Arial", 10, "overstrike"), bg=bg_color).pack(side=tk.LEFT, padx=(0, 7))
                    tk.Label(price_frame, text=f"{new_price:.2f} руб.", fg=fg_color, font=("Arial", 10, "bold"), bg=bg_color).pack(side=tk.LEFT)
                except Exception:
                    tk.Label(price_frame, text=f"{p.price} руб.", font=("Arial", 10, "bold"), bg=bg_color, fg=fg_color).pack(side=tk.LEFT)
            else:
                tk.Label(price_frame, text=f"{p.price} руб.", font=("Arial", 10, "bold"), bg=bg_color, fg=fg_color).pack(side=tk.LEFT)

            tk.Label(info_frame, text=f"Единица измерения: {p.unit}", font=("Arial", 9), bg=bg_color, fg=fg_color).pack(anchor=tk.W)
            tk.Label(info_frame, text=f"Количество на складе: {p.quantity}", font=("Arial", 9), bg=bg_color, fg=fg_color).pack(anchor=tk.W)

            # --- ПРАВАЯ ЧАСТЬ: Скидка ---
            discount_frame = tk.Frame(card_frame, width=100, bg=bg_color)
            discount_frame.pack(side=tk.RIGHT, padx=25, pady=10)
            
            tk.Label(discount_frame, text="Действующая\nскидка", font=("Arial", 9), bg=bg_color, fg=fg_color).pack()
            
            disc_fg = "red" if bg_color == "#FFFFFF" else ("#FFCCCC" if bg_color == "#2E8B57" else "red")
            tk.Label(discount_frame, text=f"{p.discount}%", font=("Arial", 14, "bold"), fg=disc_fg, bg=bg_color).pack(pady=5)