Замена данных на графике известным индексом слайдов и shape_id - PullRequest
2 голосов
/ 24 октября 2019

Я хотел бы обновить данные в столбчатой ​​диаграмме, но я получаю сообщение об ошибке на этапе доступа к объекту, содержащему диаграмму. Вот код, который дает мне shape_id:

shp=prs.slides[0].shapes
for shape in shp:
    print(
        "id: %s, type: %s, name: %s"
        % (shape.shape_id, shape.shape_type, shape.name)
    )

# => **Output:** id: 7, type: CHART (3), name: Chart 6

Но, когда я пытаюсь использовать shape_id для определения объекта диаграммы, я получаю ошибку ниже: chart = prs.slides [0] .shapes [7]. chart

Ошибка:

raise IndexError("shape index out of range")
IndexError: shape index out of range

Я также попробовал этот код: chart = shp._spTree.shape_id [7] .chart

Ошибка:

TypeError: 'int' object is not subscriptable

1 Ответ

1 голос
/ 24 октября 2019

Проблема в том, что вы используете идентификатор формы в качестве индекса в последовательности фигур. Идентификатор формы не соответствует положению этой формы в «списке» фигур.

Чтобы найти форму по идентификатору (или имени), вам необходим код, подобный следующему:

def find_shape_by_id(shapes, shape_id):
    """Return shape by shape_id."""
    for shape in shapes:
        if shape.shape_id == shape_id:
            return shape
    return None

или, если вы делаете много, вы можете использовать для этой работы диктовку:

shapes_by_id = dict((s.shape_id, s) for s in shapes)

, которая затем дает вам все удобные dict методы, такие как:

>>> 7 in shapes_by_id
True
>>> shapes_by_id[7]
<pptx.shapes.Shape object at 0x...>
...