Spaces:
Sleeping
Sleeping
File size: 7,020 Bytes
7dbe575 83e8851 7dbe575 83e8851 7dbe575 83e8851 7dbe575 83e8851 b81eb0d 221203a 7dbe575 83e8851 b81eb0d 221203a 7dbe575 83e8851 b81eb0d 221203a 7dbe575 221203a 7dbe575 83e8851 7dbe575 19ca955 83e8851 19ca955 83e8851 19ca955 7dbe575 19ca955 7dbe575 83e8851 7dbe575 83e8851 7dbe575 83e8851 7dbe575 83e8851 7dbe575 83e8851 7dbe575 83e8851 7dbe575 83e8851 7dbe575 83e8851 7dbe575 83e8851 7dbe575 83e8851 7dbe575 83e8851 7dbe575 83e8851 7dbe575 83e8851 7dbe575 83e8851 7dbe575 83e8851 efbcade 83e8851 efbcade 83e8851 efbcade 83e8851 7dbe575 |
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 |
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: يرجى مراجعة سجلات التحذيرات لتأكيد تحميل صور النظارات.") |