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


def load_products_cards(self):
        import os
        
        # 1. Очищаем старое содержимое
        for widget in self.scrollable_frame.winfo_children():
            widget.destroy()

        products = self.db.get_all_products()
        images_dir = "images"
        
        for p in products:
            # БЕРЕМ ТОЛЬКО ТО, ЧТО В БАЗЕ
            photo_name = str(p.photo).strip() if (p.photo and p.photo != "None") else ""
            img_path = os.path.join(images_dir, photo_name)
            
            # Если в базе пусто ИЛИ такого файла нет в папке — ставим заглушку
            if not photo_name or not os.path.exists(img_path):
                img_path = os.path.join(images_dir, "picture.png")

            # Создаем контейнер карточки
            card_frame = tk.Frame(self.scrollable_frame, bg="#FFFFFF", 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)

            try:
                # ВАЖНО: PhotoImage работает только с .png и .gif (иногда .jpg)
                # Если у тебя .JPG (большими буквами), попробуй переименовать их в .jpg
                img = tk.PhotoImage(file=img_path).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 as e:
                # ВЫВОДИМ ОШИБКУ В КОНСОЛЬ, чтобы понять, какой файл "битый"
                print(f"Ошибка загрузки фото {img_path}: {e}")
                tk.Label(img_container, text="Ошибка фото", bg="#FFFFFF").pack(fill=tk.BOTH, expand=True)

            # ... (остальной вывод инфо, как делали раньше)