Как добавить дополнительную градиентную заливку, кроме двух по умолчанию, для фигуры, используя python-pptx - PullRequest
1 голос
/ 11 июня 2019

У меня есть форма, и я могу изменить ее, используя градиентную заливку.Если до этого времени было больше градиентных остановок, чем по умолчанию два, я могу их проанализировать, изменить и удалить.Тем не менее, я не могу найти, как добавить дополнительную градиентную остановку.Что я и хочу.Документация совершенно правильно заявляет, что три градиентные остановки являются общей потребностью.

Я нашел «Gradient_stops._gsLst», но не знаю, как правильно добавить новую градиентную остановку.

Я попытался использовать градиент_stops.append (), который дает мне четкую подсказку о том, что ожидается (lxml.etree._Element).Но я не могу найти ничего, что описывает правильный способ создания такого элемента.Я ожидаю, что решение могло бы заключаться в том, чтобы предоставить «некоторый новый элемент GradientStop», упомянутый ниже:

shape.fill.gradient_stops._gsLst.append("some new GradientStop Element")

Попытка взять копию одного из существующих элементов Gradient Stop кажется слишком сложной для экспериментов ...

1 Ответ

0 голосов
/ 11 июня 2019

Что ж, пока вы не обнаружили поддержку API. Однако элемент градиент-стоп (<a:gs>) определяется как дочерний элемент OneOrMore, что означает, что новый элемент может быть добавлен к концу элементов в CT_GradientStopList (<a:gsLst>) путем вызова .add_gs() на этом объекте.

Так что-то вроде этого сделает что-то в правильном направлении:

>>> len(gradient_stops)
2
>>> gsLst = gradient_stops._gsLst
>>> gsLst.add_gs()
<CT_GradientStop object ... or something like that>
>>> len(gradient_stops)
3
new_gradient_stop = gradient_stops[-1]

Вопрос в том, будет ли это допустимый элемент-градиент-стоп или он вызовет ошибку восстановления; Держу пари, что он будет недостаточно заполнен, и нет простого способа добавить дочерние элементы с помощью API.

Возможно, лучший подход - это разобрать его в XML:

from pptx.oxml import parse_xml
from pptx.oxml.ns import nsdecls

new_gs = parse_xml(
    '<a:gs pos="0" %s>\n'
    '  <a:schemeClr val="accent1">\n'
    '    <a:tint val="100000"/>\n'
    '    <a:shade val="100000"/>\n'
    '    <a:satMod val="130000"/>\n'
    "  </a:schemeClr>\n"
    "</a:gs>\n" % nsdecls("a")
)
gradient_stops._gsLst.append(new_gs)

Это примерно то же самое, что делать глубокую копию на одной из уже существующих остановок, за исключением того, что вы можете указать тип цвета, например a:srgbClr, если вы не хотите использовать цвет темы. Но если вы знаете, что у вас есть такой же, как вы хотите, и просто нужно другое положение и немного подстройки цвета или что-то еще, подход глубокой копии может подойти лучше.

from copy import deepcopy

gsLst = gradient_stops._gsLst
new_gs = deepcopy(gsLst[0])
gsLst.append(new_gs)
new_gradient_stop = gradient_stops[-1]

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

...