Ошибка вставки изображения в python-pptx с ошибкой: LayoutPlaceholder не имеет атрибута insert_picture - PullRequest
1 голос
/ 02 мая 2019

Хотя я могу сгенерировать презентацию, заполнить текстовые заполнители без проблем и успешно сохранить сгенерированную презентацию, я постоянно получаю сообщение об ошибке при попытке заполнить заполнитель изображения.Я подтвердил, что я работаю с правильным объектом-заполнителем и что он является заполнителем изображения (тип 18).Я написал код для следования примерам из онлайн-документов и на данный момент не могу понять, почему я получаю эту ошибку:

AttributeError: 'LayoutPlaceholder' object has no attribute 'insert_picture'

Это исполняемый раздел кода, который выдаетошибка после выполнения последней строки:

# Bring in a new slide from layout and add to deck
objContentSlide = objPrs.slide_layouts[1]
objPrs.slides.add_slide(objContentSlide)

# Collect the placeholders
objContentShapes = objContentSlide.placeholders

# Populate title placeholder (text)
objContentSlideTitle = list(filter(lambda x: x.name == "slide1Title",objContentShapes))[0]
objContentSlideTitle.text = CNSDETAILSLIDETITLEPREFIX + strMonthName + CNSDETAILSLIDETITLESUFFIX

# Populate forecast placeholder (text)
objContentSlideForecast = list(filter(lambda x: x.name == "slide1Forecast",objContentShapes))[0]
objContentSlideForecast.text = CNSDETAILSLIDEFORECASTPREFIX + strRandomNumber0

# Populate assumptions placeholder (text)
objContentSlideAssumptions = list(filter(lambda x: x.name == "slide1Assumptions",objContentShapes))[0]
objContentSlideAssumptions.text = CNSDETAILSLIDEASSUMPTIONSPREFIX + CNSDETAILSLIDEASSUMPTIONSSTAGE + CNSDETAILSLIDEASSUMPTIONSSUFFIX + strRandomNumber1

# Populate screenshot
objContentSlideScreenshot = list(filter(lambda x: x.name == "slide1Screenshot",objContentShapes))[0]
plcName = objContentSlideScreenshot.name # Returns "slide1Screenshot"
plcType = objContentSlideScreenshot.placeholder_format.type # Returns 18
objContentSlideScreenshot.insert_picture("testShot.png",0,0)

Я обычно не работаю в Python (но полностью наслаждаюсь), поэтому, пожалуйста, дайте мне знать, если есть явная проблема соглашения, о которой я не знаю.

1 Ответ

2 голосов
/ 02 мая 2019

Документы для этой библиотеки предлагают ссылку на заполнитель по idx.

Самый надежный способ получить доступ к известному заполнителю - его idx значение

Так что я бы подумал о реализации этого подхода. Но также и, возможно, что еще более важно, здесь вы работаете с SlideLayout, а не со слайдом! Макет содержит формы и заполнители, но они не совпадают с формами и заполнителями в экземпляре слайда. (Объектная модель PPT будет ежедневно находить новые способы сбить вас с толку.)

objContentSlide = objPrs.slide_layouts[1]
objPrs.slides.add_slide(objContentSlide)

#collect the placeholders
objContentShapes = objContentSlide.placeholders

В остальной части вашего кода objContentSlide относится к SlideLayout, а не к экземпляру Slide, и объясняет, почему вы, похоже, обрабатываете LayoutPlaceholder, а не Placeholder.

Вместо этого я бы сделал что-то вроде следующего (непроверенного):

layout = objPrs.slide_layouts[1]  # handle the desired layout
slide = objPrs.slides.add_slide(layout) # create a slide instance from the layout
slide_shapes = slide.shapes
placeholders = slide.placeholders # handles the placeholders on our new slide instance

...

screenshot = list(filter(lambda x: x.name == "slide1Screenshot", slide_shapes))[0]
idx = screenshot.placeholder_format.idx
screenshot = placeholders[idx]
screenshot.insert_picture("testShot.png",0,0)
...