Python 3.x 在使用python pptx时,如何在组中获得形状的正确左侧位置?

Python 3.x 在使用python pptx时,如何在组中获得形状的正确左侧位置?,python-3.x,python-pptx,Python 3.x,Python Pptx,我正在解析一个带有三种形状的简单PowerPoint。一个形状明显位于另两个形状的左侧。但在使用python pptx进行比较时,情况并非如此。左侧形状的右侧(shape.left+shape.width)的值高于左侧其他形状(shape.left)的值。python pptx结果似乎表明右侧形状从左侧形状边界开始。这似乎是由右侧形状所在的组形状造成的 正确比较右侧形状左侧与左侧形状右侧的正确代码是什么 我已尝试删除组,然后比较显示预期值。我尝试创建新的组形状,其中包含形状,并且再次显示预期值。

我正在解析一个带有三种形状的简单PowerPoint。一个形状明显位于另两个形状的左侧。但在使用python pptx进行比较时,情况并非如此。左侧形状的右侧(shape.left+shape.width)的值高于左侧其他形状(shape.left)的值。python pptx结果似乎表明右侧形状从左侧形状边界开始。这似乎是由右侧形状所在的组形状造成的

正确比较右侧形状左侧与左侧形状右侧的正确代码是什么

我已尝试删除组,然后比较显示预期值。我尝试创建新的组形状,其中包含形状,并且再次显示预期值。但是,位于www.mibnet.se/LeftBoxIssue.pptx的链接PowerPoint文件是组形状影响正常结果的一个示例。运行代码时,我不知道形状是如何创建的。我需要一种通用的方法来正确测试这个特殊情况

from pptx import Presentation
from pptx.enum.shapes import MSO_SHAPE_TYPE

strStartPowerPoint=r".\LeftBoxIssue.pptx"
prs=Presentation(strStartPowerPoint)
slide=prs.slides[0]
for shpShape in slide.shapes:
    if shpShape.shape_type == MSO_SHAPE_TYPE.GROUP:
        print(shpShape.shapes[0].text+
             " has   Left="+str(shpShape.shapes[0].left)+
             " and right="+
             str(shpShape.shapes[0].left+shpShape.shapes[0].width))
    else:
        print(shpShape.text+" has Left="+str(shpShape.left)+
             " and right="+str(shpShape.left+shpShape.width))
我希望右手形状的“左”值大于左手形状的“右”值。但是,它打印的值较小:

Left has Left=160326 and right=6254527
Right has Left=3291751 and right=3846370

了解这一点的一个好地方是检查组形状XML:

print(group_shape._element.xml)
在那里,您将发现一个子元素,如下所示:

<p:grpSpPr>
  <a:xfrm>
    <a:off x="3347864" y="2204864"/>
    <a:ext cx="3506688" cy="2930624"/>
    <a:chOff x="3347864" y="2204864"/>
    <a:chExt cx="3506688" cy="2930624"/>
  </a:xfrm>
</p:grpSpPr>
这些值以英制公制单位(EMU)表示,此处介绍了如何方便地对其进行操作:


python-pptx
始终使用与组形状位置相等的子偏移量(
a:off
),因为这很方便。其他包可以使用更方便其用途的其他组形状偏移。例如,如果您要移动一个组,您可以通过仅在组中更改
a:off
来完成,而不必访问和更新每个子形状位置。

谢谢,我将尝试一下。这是否也会影响组形状中的组形状?这意味着我需要首先转到顶部组形状,并通过链应用相同的调整来获得总偏移量?我希望如此。在它作为子形状的角色中,组形状就像封闭组中的任何其他形状。好的,我测试了它。我对你的答案的解释是,由于chOff[“x”]不起作用,所以对你的答案进行了调整,如下:“真左”表示shape=shpShape.left+group\u shape.\u element.xpath(“./p:grpSpPr/a:xfrm/a:off”)[0].x+group\u shape.\u element.xpath(./p:grpSpPr/a:xfrm/a:chOff”)[0]。这与你的说法一致吗?好的,是的,我已经有一段时间没有使用
lxml
native访问了,从
lxml.etree获取属性的两种方法看起来像是
chOff.get(“x”)
chOff.attrib[“x”]
chOff.x
属性之所以有效,是因为该元素是由
pythonpptx
oxml
对象“包装”的,因此当您深入挖掘XML中的API支持时,所有元素都不起作用。但在这种情况下,它绝对是一个很好的紧凑版本,它甚至可以为您将类型转换为
Emu
对象,等等(lxml版本总是返回str)。
chOff = group_shape._element.xpath("./p:grpSpPr/a:xfrm/a:chOff")[0]
chOff_x = int(chOff["x"])
chOff_y = int(chOff["y"])