解释
简而言之,该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有时间,他会阅读这篇文章。也许对此也有更好的解决方案,我完全错过了一些东西。