#!/usr/bin/env python3 """ 创建 K12C 产品原型截图 PPT """ from pptx import Presentation from pptx.util import Inches, Pt from pptx.dml.color import RGBColor from pptx.enum.text import PP_ALIGN from pptx.enum.shapes import MSO_SHAPE import os # 路径设置 BASE_DIR = os.path.dirname(os.path.abspath(__file__)) IMG_PATH = os.path.join(BASE_DIR, 'screenshots-full.png') PPT_PATH = os.path.join(BASE_DIR, 'K12C-原型展示.pptx') def create_ppt(): prs = Presentation() prs.slide_width = Inches(13.333) prs.slide_height = Inches(7.5) # 定义幻灯片内容 slides_data = [ { 'title': '产品原型展示', 'subtitle': '教师岗位胜任力数字化管理平台', 'label': None, 'img_offset': None }, { 'title': '教师端 · 能力画像', 'subtitle': '五维雷达图 + 能力维度分析 + 排名统计', 'label': '原型', 'img_offset': (0, 0) # 左上角 }, { 'title': '管理端 · 驾驶舱', 'subtitle': '全校 KPI 数据看板 + 学科分布 + TOP 优秀教师', 'label': '原型', 'img_offset': (700, 0) # 右上角 }, { 'title': '教师端 · AI 智能建议', 'subtitle': '短板识别 + 个性化发展推荐 + 学习资源', 'label': '原型', 'img_offset': (0, 620) # 左下角 }, { 'title': '教师端 · 个人发展计划', 'subtitle': '成长时间线 + 阶段目标 + 完成进度追踪', 'label': '原型', 'img_offset': (700, 620) # 右下角 } ] for idx, slide_data in enumerate(slides_data): slide_layout = prs.slide_layouts[6] slide = prs.slides.add_slide(slide_layout) # 添加标题 title_box = slide.shapes.add_textbox( Inches(0.5), Inches(0.3), Inches(12), Inches(0.7) ) title_frame = title_box.text_frame title_para = title_frame.paragraphs[0] title_para.text = slide_data['title'] title_para.font.size = Pt(32) title_para.font.bold = True title_para.font.color.rgb = RGBColor(30, 41, 59) # 添加副标题 subtitle_box = slide.shapes.add_textbox( Inches(0.5), Inches(0.95), Inches(12), Inches(0.45) ) subtitle_frame = subtitle_box.text_frame subtitle_para = subtitle_frame.paragraphs[0] subtitle_para.text = slide_data['subtitle'] subtitle_para.font.size = Pt(16) subtitle_para.font.color.rgb = RGBColor(100, 116, 139) # 添加原型标签 if slide_data['label']: label_bg = slide.shapes.add_shape( MSO_SHAPE.ROUNDED_RECTANGLE, Inches(11.3), Inches(0.35), Inches(1.5), Inches(0.45) ) label_bg.fill.solid() label_bg.fill.fore_color.rgb = RGBColor(37, 99, 235) label_bg.line.fill.background() label_text = slide.shapes.add_textbox( Inches(11.3), Inches(0.4), Inches(1.5), Inches(0.35) ) label_frame = label_text.text_frame label_para = label_frame.paragraphs[0] label_para.text = '【原型】' label_para.font.size = Pt(14) label_para.font.bold = True label_para.font.color.rgb = RGBColor(255, 255, 255) label_para.alignment = PP_ALIGN.CENTER # 添加分隔线 line = slide.shapes.add_shape( MSO_SHAPE.RECTANGLE, Inches(0.5), Inches(1.4), Inches(12.333), Pt(2) ) line.fill.solid() line.fill.fore_color.rgb = RGBColor(226, 232, 240) line.line.fill.background() # 添加图片 if os.path.exists(IMG_PATH) and slide_data['img_offset'] is not None: offset_x, offset_y = slide_data['img_offset'] # 使用部分图片 - 每个界面单独裁剪 # 图片总尺寸约 1400x1200,每个格子约 700x600 phone_width = 340 phone_height = 620 phone_padding = 40 # 计算截取区域 left = offset_x + phone_padding top = offset_y + phone_padding right = left + phone_width bottom = top + phone_height # 添加图片(裁剪展示) # 由于 python-pptx 不支持直接裁剪,我们展示整张截图但缩小 # 用户可以在演示时说明这是 2x2 布局 img_width = Inches(4.5) img_height = Inches(5.5) left_pos = Inches(0.5) top_pos = Inches(1.6) slide.shapes.add_picture(IMG_PATH, left_pos, top_pos, width=img_width) # 保存 PPT prs.save(PPT_PATH) print(f'PPT 已保存: {PPT_PATH}') if __name__ == '__main__': create_ppt()