import gradio as gr from PIL import Image, ImageDraw # ----------------------------- # 50 อวัยวะ + คำอธิบาย # ----------------------------- organs = { "สมอง":"ควบคุมความคิดและร่างกาย 🧠", "ตา":"มองเห็น 👁️", "หูซ้าย":"รับเสียง 👂", "หูขวา":"รับเสียง 👂", "จมูก":"ดมกลิ่น 👃", "ปาก":"พูดและกิน 👄", "ลิ้น":"รับรส 👅", "หัวใจ":"สูบฉีดเลือด ❤️", "ปอดซ้าย":"แลกเปลี่ยนก๊าซ 💨", "ปอดขวา":"แลกเปลี่ยนก๊าซ 💨", "ตับ":"กรองของเสีย 🍷", "ตับอ่อน":"สร้างอินซูลิน 💊", "กระเพาะอาหาร":"ย่อยอาหาร 🍽️", "ลำไส้เล็ก":"ดูดซึมอาหาร 🌀", "ลำไส้ใหญ่":"ขับของเสีย 💩", "ไตซ้าย":"กรองของเสีย 💧", "ไตขวา":"กรองของเสีย 💧", "ม้าม":"ทำลายเม็ดเลือดเก่า 💉", "ถุงน้ำดี":"เก็บน้ำดี 💚", "หลอดอาหาร":"ส่งอาหารไปกระเพาะ 🍴", "หลอดลม":"ส่งอากาศเข้าสู่ปอด 🌬️", "กระเพาะปัสสาวะ":"เก็บปัสสาวะ 🚰", "มดลูก":"ที่อยู่ของทารก 🤰", "รังไข่ซ้าย":"สร้างไข่ ⚪", "รังไข่ขวา":"สร้างไข่ ⚪", "อัณฑะซ้าย":"ผลิตอสุจิ ⚽", "อัณฑะขวา":"ผลิตอสุจิ ⚽", "ช่องคลอด":"ช่องทางสืบพันธุ์ 🚺", "อวัยวะเพศชาย":"ช่องทางสืบพันธุ์ 🚹", "หัวใจห้องบนซ้าย":"หัวใจส่วนบนซ้าย ❤️", "หัวใจห้องบนขวา":"หัวใจส่วนบนขวา ❤️", "หัวใจห้องล่างซ้าย":"หัวใจส่วนล่างซ้าย ❤️", "หัวใจห้องล่างขวา":"หัวใจส่วนล่างขวา ❤️", "ต่อมไทรอยด์":"ควบคุมเมตาบอลิซึม 🧬", "ต่อมหมวกไตซ้าย":"ควบคุมฮอร์โมน 🧫", "ต่อมหมวกไตขวา":"ควบคุมฮอร์โมน 🧫", "ไขสันหลัง":"ส่งสัญญาณประสาท 🧬", "กล้ามเนื้อแขน":"เคลื่อนไหวแขน 💪", "กล้ามเนื้อขา":"เคลื่อนไหวขา 💪", "มือ":"จับสิ่งของ ✋", "เท้า":"ทรงตัว 🦶", "เข่า":"พับขา 🦵", "สะโพก":"รองรับน้ำหนัก 🍑", "ไส้ติ่ง":"ส่วนต่อของลำไส้ใหญ่ 🩺", "กระจกตา":"ช่วยมองเห็น 👁️", "จอประสาทตา":"แปลงแสงเป็นสัญญาณ 🧠", "หลอดลมฝอย":"ส่งอากาศสู่ถุงลม 🌬️", "หัวใจรวม":"หัวใจรวมทุกส่วน ❤️", "ตับรวม":"ตับรวมทุกส่วน 🍷", "ปอดรวม":"ปอดรวมทั้งสองข้าง 💨", "ลำไส้รวม":"ลำไส้รวมทุกส่วน 🌀", "กระเพาะรวม":"กระเพาะรวม 🍽️" } # ----------------------------- # สร้างภาพร่างกาย + กรอบอวัยวะ (ตำแหน่งสมมุติ) # ----------------------------- def create_body_image(): img = Image.new("RGB", (500, 1000), "white") draw = ImageDraw.Draw(img) positions = [] y = 10 for i in range(50): x1, y1 = 50, y x2, y2 = 450, y+15 draw.rectangle([x1, y1, x2, y2], outline="red", width=2) positions.append((x1, y1, x2, y2)) y += 20 return img, positions img, positions = create_body_image() # ----------------------------- # ฟังก์ชันตรวจสอบคลิก # ----------------------------- def detect_organ(evt: gr.SelectData): x, y = evt.index[0], evt.index[1] for i, (x1,y1,x2,y2) in enumerate(positions): if x1 <= x <= x2 and y1 <= y <= y2: organ_name = list(organs.keys())[i] return f"{organ_name}: {organs[organ_name]}" return "คลิกบนกรอบอวัยวะเพื่อดูคำอธิบาย" # ----------------------------- # Gradio Interface # ----------------------------- with gr.Blocks() as demo: gr.Markdown("## 🧍 ระบบเรียนรู้อวัยวะ 50 ชิ้น (คลิกที่กรอบอวัยวะ)") img_display = gr.Image(value=img, interactive=True) output = gr.Textbox(label="ข้อมูลอวัยวะ", interactive=False) img_display.select(detect_organ, None, output) demo.launch()