除了默认的两个之外,如何使用 python-pptx 为形状添加额外的渐变填充停止点

How to add an additional gradient fill stop, besides the default two, for a shape, using python-pptx

我有一个形状,可以更改形状以使用渐变填充。如果它之前有比默认两个更多的梯度停止,我可以解析它们,更改它们并删除它们。但是,我找不到如何添加额外的渐变停止点。这就是我想要的。文档非常正确地说明了三个梯度停止点是常见的需要。

我找到了 "gradient_stops._gsLst",但不知道添加新渐变色标的正确方法。

我曾尝试使用 gradient_stops.append(),它给了我预期的明确提示(lxml.etree._Element)。但我找不到任何描述创建此类元素的正确方法的内容。我希望解决方案是提供下面提到的 "some new GradientStop Element":

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

尝试复制一个现有的 Gradient Stop 元素感觉像是在尝试太多...

好吧,正如您所发现的那样,API 还没有对此的支持。但是,gradient-stop 元素 (<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]

问题是它是否是一个有效的 gradient-stop 元素,或者它是否会触发修复错误;我敢打赌它不会被足够填充并且没有简单的方法来使用 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]

我依稀记得仓位严格增加很重要,我认为它忽略了任何不超过先前止损的仓位,因此最好将其牢记在心。