解释
简而言之,该True值没有显式设置(与 相比False),因为True对应于overlay'sval属性的默认值。
为了更详细地解释它 - 您可以按照以下方式遵循 python-pptx 层次结构:overlay映射到(所有覆盖oxmlCT_Boolean元素都从 CT_Boolean 实例化)。实际val参数然后通过映射OptionalAttribute并使用默认值定义True:
class CT_Boolean(BaseOxmlElement):
"""
Common complex type used for elements having a True/False value.
"""
val = OptionalAttribute('val', XsdBoolean, default=True)
现在,当将可选属性设置为其默认值时,它实际上被跳过/删除,如您在此处 if value == self._default看到的:
class OptionalAttribute(BaseAttribute):
"""
Defines an optional attribute on a custom element class. An optional
attribute returns a default value when not present for reading. When
assigned |None|, the attribute is removed.
"""
@property
def _setter(self):
def set_attr_value(obj, value):
if value == self._default:
if self._clark_name in obj.attrib:
del obj.attrib[self._clark_name]
return
str_value = self._simple_type.to_xml(value)
obj.set(self._clark_name, str_value)
return set_attr_value
修复 - 提供自定义 CT_Boolean 类
在需要使用叠加层之前将这些行添加到某处。它将使用自定义类覆盖 python-pptxoverlay映射:CT_Boolean_NoDefault
from pptx.oxml import register_element_cls
from pptx.oxml.xmlchemy import BaseOxmlElement, OptionalAttribute
from pptx.oxml.simpletypes import XsdBoolean
class CT_Boolean_NoDefault(BaseOxmlElement):
"""
Common complex type used for elements having a True/False value with no
default value.
"""
val = OptionalAttribute('val', XsdBoolean)
register_element_cls('c:overlay', CT_Boolean_NoDefault)
这对我有用,最后我得到了:
<c:legend>
<c:overlay val="1"/>
</c:legend>
修复 - 永久修改 python-pptx
不建议这样做,但您可能想要修改 python-pptx 而不是从上面为您运行的每个脚本添加解决方案。
首先,添加以下内容,pptx/oxml/chart/shared.py其中定义了一个没有默认值的新 bool 类:
class CT_Boolean_NoDefault(BaseOxmlElement):
"""
Common complex type used for elements having a True/False value.
"""
val = OptionalAttribute('val', XsdBoolean)
二、修改pptx/oxml/__init__.py添加新的bool类:
from .chart.shared import (
CT_Boolean, CT_Double, CT_Layout, CT_LayoutMode, CT_ManualLayout,
CT_NumFmt, CT_Tx, CT_UnsignedInt, CT_Boolean_NoDefault
)
三、修改改变元素到新的bool类pptx/oxml/__init__.py的映射:overlay
register_element_cls('c:overlay', CT_Boolean_NoDefault)
更好的解决方案
如果您有时间,请提交一张票here,以便它可能成为永久修复。万一@scanny有时间,他会阅读这篇文章。也许对此也有更好的解决方案,我完全错过了一些东西。