文章目录
- 效果
- 原理
- 1. 阴影继承机制解析
- 2. XML层操作细节
- 3. 注意事项
- 扩展应用
- 1. 批量去除阴影
- 2. 复合效果控制
效果
右边这个是直接添加一个形状。可以看到它会默认被赋予一个阴影。
然而,这个东西在特定的场合,其实是我们所不需要的。
那怎么把这个阴影给消掉呢?
左边这个就是我们用代码实现的,没有阴影的效果。
怎么做到的呢?
咱直接给出代码:
from pptx.util import Inches, Pt
from pptx.enum.shapes import MSO_SHAPE
from pptx import Presentation
prs = Presentation()
slide_layout = prs.slide_layouts[0]
slide = prs.slides.add_slide(slide_layout)
# 定义矩形的位置和尺寸(以英寸为单位)
left = Inches(1)
top = Inches(1)
width = Inches(3)
height = Inches(2)
# 添加矩形
rectangle = slide.shapes.add_shape(
MSO_SHAPE.RECTANGLE,
left, top, width, height
)
rectangle.shadow.inherit = False
prs.save("example.pptx")
核心就是这句代码:
rectangle.shadow.inherit = False
原理
1. 阴影继承机制解析
- 默认继承逻辑:PowerPoint形状的阴影效果继承自模板/主题的
effectLst
元素。当该XML元素不存在时,形状自动继承上级样式(返回inherit=True
) - 显式覆盖机制:通过
rectangle.shadow.inherit = False
强制创建空的effectLst
元素,这会:- 中断样式继承链
- 清空所有视觉效果(包括阴影/发光/反射等)
- 使
effectLst
进入"显式定义"状态(此时inherit
返回False)
2. XML层操作细节
<!-- 默认状态(无effectLst元素) -->
<p:spPr>
<!-- 继承主题效果 -->
</p:spPr>
<!-- 执行inherit=False后的状态 -->
<p:spPr>
<a:effectLst/> <!-- 空效果列表 -->
</p:spPr>
该操作等效于在PPT界面中:
右键形状 → 设置形状格式 → 效果 → 阴影 → 无阴影
3. 注意事项
- 副作用:该方法会同时移除其他视觉效果(如发光、柔化边缘等),如需保留其他效果需手动重建
- 性能影响:频繁操作
effectLst
可能引发XML结构重排(类似DOM操作) - 样式恢复:设置
inherit=True
将删除effectLst
元素,恢复继承关系
扩展应用
1. 批量去除阴影
for shape in slide.shapes:
if shape.has_shadow:
shape.shadow.inherit = False
2. 复合效果控制
# 单独关闭阴影但保留发光效果(需API支持)
shape.shadow.inherit = False
shape.glow.inherit = True # 需要底层XML结构调整
特别提示:当前python-pptx API对
effectLst
的控制粒度较粗,精细控制建议直接操作shape._element
的XML结构