glasses_test2 / app.py
ahmedyoussef1's picture
Update app.py
efbcade verified
import gradio as gr
from PIL import Image
import os
import numpy as np
import cv2 # فقط لقراءة الصور باستخدام imread لضمان التوافق
# ----------------------------------------------------
# A. الكتالوج والبيانات التجارية (JPG)
# ----------------------------------------------------
# 🚨 المسارات تطابق تمامًا ملفات JPG المرفوعة حاليًا في مجلد assets/
GLASSES_CATALOG = {
# النظارة 1
"النظارة المستديرة (1)": {
"path": "assets/507b01553ce6931a5d45b5554893a24a.jpg",
"price": 120.00,
"description": "نظارة مستديرة كلاسيكية، مثالية للوجه البيضاوي.",
"shape_fit": "بيضاوي"
},
# النظارة 2
"النظارة الطيار (2)": {
"path": "assets/56a9c0a1d10c21d475159d6890f4cf48.jpg",
"price": 85.00,
"description": "تصميم طياري رقيق، يبرز جمال الوجه.",
"shape_fit": "بيضاوي"
},
# النظارة 3
"النظارة المربعة (3)": {
"path": "assets/b1c4d0a357457c77974d5ce4580d0e8e.jpg",
"price": 99.00,
"description": "إطار مربع عصري، مناسب لإضافة تحديد للوجه البيضاوي.",
"shape_fit": "بيضاوي"
}
}
LOADED_GLASSES = {}
def load_glasses():
"""تحميل صور النظارات عند بدء التشغيل."""
all_loaded = True
for name, data in GLASSES_CATALOG.items():
try:
# استخدام OpenCV للقراءة لضمان التوافق مع بيئة Space
img_bgr = cv2.imread(data['path'], cv2.IMREAD_COLOR)
if img_bgr is not None and img_bgr.size > 0:
# تحويلها إلى RGB لكي تتعامل معها مكتبة Gradio بشكل صحيح
img_rgb = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2RGB)
LOADED_GLASSES[name] = img_rgb
print(f"✅ تم تحميل النظارة '{name}' بنجاح.")
else:
print(f"❌ فشل تحميل النظارة '{name}' من المسار: {data['path']}. يرجى التحقق من وجود الملف واسم الامتداد.")
all_loaded = False
except Exception as e:
print(f"❌ خطأ حاد أثناء محاولة تحميل '{name}': {e}")
all_loaded = False
if not all_loaded:
print("❌ فشل تشغيل Gradio: يرجى مراجعة سجلات التحذيرات لتأكيد تحميل صور النظارات.")
return all_loaded
GLASSES_LOADED_OK = load_glasses()
# ----------------------------------------------------
# B. دالة عرض الكتالوج فقط (لا تحتاج مدخلات)
# ----------------------------------------------------
def display_catalog():
"""عرض بيانات الكتالوج والصور المحملة مسبقًا."""
# تصفية الكتالوج (هنا الكل سيظهر لأنه لا يوجد شرط على الوجه)
filtered_glasses = {
name: data for name, data in GLASSES_CATALOG.items()
if name in LOADED_GLASSES
}
# إعداد المُخرجات للواجهة (3 نظارات)
output_imgs = [None] * 3
output_info = [None] * 3
for i, (name, data) in enumerate(filtered_glasses.items()):
if i < 3:
output_imgs[i] = LOADED_GLASSES[name]
output_info[i] = (
f"**{name}**\n"
f"🏷️ السعر: **{data['price']:.2f} $**\n"
f"{data['description']}"
)
# المُخرجات تقتصر على صور النظارات ومعلوماتها
return (
output_imgs[0], output_info[0],
output_imgs[1], output_info[1],
output_imgs[2], output_info[2]
)
# ----------------------------------------------------
# C. تشغيل التطبيق (الواجهة التسويقية باستخدام gr.Blocks)
# ----------------------------------------------------
custom_css = """
.gradio-container { max-width: 1600px; margin: 0 auto; font-family: 'Arial', sans-serif !important; }
.product-card { border: 1px solid #e0e0e0; border-radius: 10px; padding: 10px; background-color: #ffffff; box-shadow: 0 4px 6px rgba(0, 0, 0, 0.05); transition: box-shadow 0.3s ease; }
.product-card:hover { box-shadow: 0 6px 12px rgba(0, 0, 0, 0.1); }
.info-box { background-color: #f8f9fa; padding: 10px; border-radius: 8px; margin-top: 5px; direction: rtl; }
"""
if GLASSES_LOADED_OK:
with gr.Blocks(title="كتالوج النظارات التسويقي", theme=gr.themes.Soft(), css=custom_css) as demo:
gr.Markdown(
"""
# 🛍️ **كتالوج النظارات التسويقي**
إليك نظاراتنا المتاحة حاليًا (3 نظارات) مع تفاصيلها وأسعارها.
---
"""
)
gr.Markdown("## ✨ الكتالوج المقترح لك")
# 1. قسم عرض الكتالوج (3 منتجات)
# تعريف المخرجات (صور النظارات ومعلوماتها)
output_img1 = gr.Image(label="النظارة 1", show_label=False)
output_info1 = gr.Markdown("---", elem_classes=["info-box"])
output_img2 = gr.Image(label="النظارة 2", show_label=False)
output_info2 = gr.Markdown("---", elem_classes=["info-box"])
output_img3 = gr.Image(label="النظارة 3", show_label=False)
output_info3 = gr.Markdown("---", elem_classes=["info-box"])
all_outputs = [output_img1, output_info1, output_img2, output_info2, output_img3, output_info3]
with gr.Row():
with gr.Column(scale=1, elem_classes=["product-card"]):
# تم حذف: output_img1.render()
# تم حذف: output_info1.render()
pass # العناصر تُعرض تلقائياً بمجرد تعريفها في السياق
with gr.Column(scale=1, elem_classes=["product-card"]):
# تم حذف: output_img2.render()
# تم حذف: output_info2.render()
pass
with gr.Column(scale=1, elem_classes=["product-card"]):
# تم حذف: output_img3.render()
# تم حذف: output_info3.render()
pass
# تشغيل الدالة لعرض الكتالوج بمجرد تحميل الواجهة
demo.load(
fn=display_catalog,
inputs=None,
outputs=all_outputs
)
demo.launch(server_name="0.0.0.0", server_port=7860)
else:
print("❌ فشل تشغيل Gradio: يرجى مراجعة سجلات التحذيرات لتأكيد تحميل صور النظارات.")