1 Вопрос: Ошибка вставки изображения в python-pptx с ошибкой: LayoutPlaceholder не имеет атрибута insert_picture

вопрос создан в Thu, May 2, 2019 12:00 AM

Хотя я могу создать презентацию, заполнить текстовые заполнители без проблем и успешно сохранить сгенерированную презентацию, я постоянно получаю сообщение об ошибке при попытке заполнить заполнитель изображения. Я подтвердил, что я работаю с правильным объектом-заполнителем и что он является заполнителем изображения (тип 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
  1. re: условные обозначения: рассмотрите возможность избежать такого грубого системы венгерского языка нотации (не только для python, но особенно для python!), которую вы используете. objContentSlideAssumptions может быть просто slide_assumptions, objPrs должно быть просто что-то вроде pres или presentation и т. Д.
    2019-05-02 15: 00: 40Z
1 ответ                              1                         

Документы для этой библиотеки предлагают ссылаться на заполнитель по 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)
    
2
2019-05-03 15: 13: 33Z
источник размещен Вот