python-pptx中PlaceholderPicture调用insert_picture报错排查
在python-pptx的占位符中插入图片时出现AttributeError的解决方法
问题场景
尝试在PPT的占位符中插入图片,编写代码如下:
for shape in presentation.slides[(len(presentation.slides) - 1)].placeholders: print(shape.name) print(shape.shape_type) print(shape.placeholder_format.type) if "Bild" in shape.name: shape.insert_picture(os.path.join(self.image_folder, "media_value.png"))
执行后输出:
Bildplatzhalter 17 PLACEHOLDER (14) PICTURE (18)
但触发错误:
shape.insert_picture(os.path.join(self.image_folder, "media_value.png")) AttributeError: 'PlaceholderPicture' object has no attribute 'insert_picture'
使用Python 3.9和python-pptx 0.6.21版本,按照官方文档操作却报错,求问题原因及解决办法。
问题原因
当占位符的格式类型为PICTURE时,python-pptx返回的是PlaceholderPicture对象,这个对象本身没有insert_picture方法——insert_picture是针对**未绑定具体内容的普通占位符(Placeholder)**的方法,而非已关联图片类型的占位符实例。
解决方法
对于PlaceholderPicture对象,需通过其picture属性获取关联的图片实例,再调用replace()方法替换图片内容,修改后的代码如下:
import os for shape in presentation.slides[-1].placeholders: print(shape.name) print(shape.shape_type) print(shape.placeholder_format.type) if "Bild" in shape.name: # 处理PlaceholderPicture类型的占位符 pic = shape.picture pic.replace(os.path.join(self.image_folder, "media_value.png"))
补充说明
- 如果是未填充过内容的空白图片占位符,在旧版本python-pptx中可能返回普通
Placeholder对象,此时可以使用insert_picture;但如果占位符已被预设了图片(哪怕是默认的空白占位图),就会返回PlaceholderPicture对象,需要用替换的方式处理。 - 你使用的0.6.21是较早的稳定版本,该版本中
PlaceholderPicture的行为就是如此;升级到更高版本(如0.6.23及以上)可能会有更统一的API,但上述替换方法在旧版本中完全有效。
内容的提问来源于stack exchange,提问作者Tobias
相关产品推荐
相关产品推荐

