import io import sys import os import subprocess import traceback import time import base64 import re import gradio as gr # دالة ذكية مستوحاة من Pydroid 3 لفحص الكود وتثبيت المكتبات المستدعاة تلقائياً def auto_install_imports(code): # البحث عن كل العبارات الفنية مثل import X أو from X import Y imports = re.findall(r'^\s*(?:import|from)\s+([a-zA-Z0-9_]+)', code, re.MULTILINE) # استبعاد المكتبات القياسية المضمنة في بايثون لتسريع التشغيل standard_libs = [ "sys", "os", "io", "time", "re", "math", "random", "json", "datetime", "hashlib", "urllib", "subprocess", "threading", "traceback", "builtins" ] installed_now = [] for lib in set(imports): if lib not in standard_libs: try: __import__(lib) except ImportError: # إذا كانت المكتبة غير موجودة، يتم تثبيتها فوراً عبر pip try: subprocess.check_call([sys.executable, "-m", "pip", "install", lib]) installed_now.append(lib) except Exception: pass return installed_now def pydroid_core_engine(code, terminal_inputs): if not code or not code.strip(): return "⚠️ [Pydroid Core]: لا يوجد كود برمي داخل المحرر لتشغيله.", "الرجاء كتابة كود بايثون...", None, None # 1. تشغيل ميزة التثبيت التلقائي للمكتبات قبل التنفيذ installed_libs = auto_install_imports(code) install_status = f"📦 تم فحص السكربت وتثبيت المكتبات تلقائياً: {installed_libs}\n" if installed_libs else "" # 2. تنظيف مخلفات الرسوميات والمحاكاة السابقة for f in ["live_frame.png", "live_simulation.html"]: if os.path.exists(f): try: os.remove(f) except: pass # 3. محاكاة آلية قراءة الطرفية (Terminal Inputs) الحر تماماً user_lines = terminal_inputs.splitlines() if terminal_inputs else [] modified_code = f""" import builtins _terminal_data = {repr(user_lines)} _data_ptr = 0 def _pydroid_input(prompt=""): global _data_ptr if prompt: print(prompt, end="") if _data_ptr < len(_terminal_data): val = _terminal_data[_data_ptr] print(val) # طباعة المدخل في الكونسول لمحاكاة الشاشة السوداء _data_ptr += 1 return val return "" # نص فارغ لمنع توقف السيرفر المفاجئ عند انتهاء الأسطر builtins.input = _pydroid_input """ + code # 4. توجيه قنوات المخرجات والتحكم الرسومي بأمان مفرط old_stdout, old_stderr = sys.stdout, sys.stderr redirected_output = sys.stdout = io.StringIO() redirected_error = sys.stderr = io.StringIO() exec_env = {} error_occurred = False start_time = time.time() try: # تنفيذ السكربت البرمجي مباشرة exec(modified_code, exec_env) except Exception: error_occurred = True print(traceback.format_exc(), file=redirected_error) runtime_duration = round(time.time() - start_time, 2) stdout_text = redirected_output.getvalue() stderr_text = redirected_error.getvalue() # إعادة قنوات النظام الأصلية فوراً لحماية البيئة الحاضنة sys.stdout, sys.stderr = old_stdout, old_stderr # 5. معالجة وتوليد واجهات العرض ثلاثية الأبعاد والأشكال الثابتة interactive_visual_html = None if os.path.exists("live_simulation.html"): try: with open("live_simulation.html", "r", encoding="utf-8") as f: html_content = f.read() b64_encoded = base64.b64encode(html_content.encode('utf-8')).decode('utf-8') interactive_visual_html = f'' except Exception as e: stderr_text += f"\n[Error 3D Render]: {e}" static_frame_img = "live_frame.png" if os.path.exists("live_frame.png") else None # صياغة حالة التقرير النهائي للوحة التحكم if error_occurred or stderr_text: status_msg = f"❌ انتهى التشغيل بوجود خطأ | المستغرق: {runtime_duration} ثانية" console_final = f"{install_status}{stdout_text}\n⚠️ --- تفاصيل خطأ السكربت ---\n{stderr_text}" return status_msg, console_final, static_frame_img, interactive_visual_html else: status_msg = f"✅ اكتمل التنفيذ بنجاح كلي | المستغرق: {runtime_duration} ثانية" console_final = f"{install_status}{stdout_text}" if (stdout_text or install_status) else "ℹ️ تم تنفيذ السكربت بنجاح (لا توجد مخرجات نصية لعرضها)." return status_msg, console_final, static_frame_img, interactive_visual_html # 🎨 هندسة الواجهة الرسومية الاحترافية المظلمة المطابقة لـ Pydroid 3 ui_theme_css = """ body, .gradio-container { background-color: #12141c !important; font-family: 'Consolas', 'Segoe UI', monospace; } .pydroid-header { background: linear-gradient(135deg, #1e293b, #0f172a); border: 1px solid #334155; border-radius: 12px; padding: 18px; text-align: center; margin-bottom: 15px; } .pydroid-header h1 { color: #ffe600; margin: 0; font-size: 26px; font-weight: bold; text-shadow: 0 0 12px rgba(255, 230, 0, 0.2); } .pydroid-header p { color: #94a3b8; font-size: 13px; margin-top: 5px; } .section-lbl { color: #38bdf8; font-weight: bold; font-size: 14px; margin-bottom: 6px; } """ with gr.Blocks() as demo: gr.HTML("

🖥️ PYDROID 3 ADVANCED CORE ENGINE

بيئة تطوير متكاملة على المتصفح مع تثبيت تلقائي للمكتبات وحقن طرفي حر للمدخلات

") with gr.Row(): system_status = gr.Textbox(label="حالة معالج السيرفر الحالي", value="🟢 مستقر تماماً ومستعد للتشغيل الحُر...", interactive=False) with gr.Row(): with gr.Column(scale=3): gr.HTML("
📝 محرر أكواد بايثون (Python Code Editor)
") code_editor = gr.Code( language="python", lines=15, label=None, value="# اكتب أو الصق سكربت الأداة هنا\nprint('مرحباً بك في نظام Pydroid 3 المطور!')\nname = input('أدخل اسمك هنا: ')\nprint('أهلاً وسهلاً بك يا', name)" ) with gr.Column(scale=2): gr.HTML("
📥 شاشة مدخلات الطرفية الحرة (Terminal Inputs)
") terminal_box = gr.Textbox( lines=5, label=None, placeholder="اكتب هنا كافة المدخلات أو الخيارات التي سيطلبها منك السكربت.\nضع كل إدخال في سطر منفصل بحرية تامة..." ) execute_btn = gr.Button("⚡ تشغيل السكربت (Run Code)", variant="primary", size="lg") with gr.Row(): with gr.Column(): gr.HTML("
📺 شاشات عرض النتائج وبث المحاكاة والتفاعل
") with gr.Tabs(): with gr.Tab("📋 مخرجات الطرفية النصية (Console Out)"): console_view = gr.Textbox(lines=11, label=None, interactive=False) with gr.Tab("🌐 لوحة التحكم التفاعلية 3D"): visual_3d_html = gr.HTML() with gr.Tab("🖼️ شاشة البث الصوري الثابت"): visual_static_img = gr.Image(label=None, interactive=False) # ربط كبسة التشغيل الفوري بالمعالج المستقر الجديد execute_btn.click( fn=pydroid_core_engine, inputs=[code_editor, terminal_box], outputs=[system_status, console_view, visual_static_img, visual_3d_html] ) # تشغيل وإطلاق السيرفر مع تمرير التنسيق الخارجي داخل دالة launch حصرياً if __name__ == "__main__": demo.launch(css=ui_theme_css, theme=gr.themes.Default())