AutoShape

自动形状是规则形状。正方形,圆形,三角形,星星,诸如此类。有 182 种不同的自动形状可供选择。其中 120 个有调整“手柄”,你可以用来改变形状,有时是戏剧性的。

许多形状类型共享一组共同的属性。我们将在这里介绍其中的许多形状,因为其中有几个形状只是 AutoShape 的特殊形式。

添加自动形状

下面的代码添加了圆角矩形(1 英寸正方形),并位于幻灯片左上角 1 英寸处:

from pptx.enum.shapes import MSO_SHAPE

shapes = slide.shapes
left = top = width = height = Inches(1.0)
shape = shapes.add_shape(
    MSO_SHAPE.ROUNDED_RECTANGLE, left, top, width, height
)

请参阅 MSO_AUTO_SHAPE_TYPE 枚举页中所有 182 个自动形状类型的列表。

理解英语度量单位

在前面的示例中,我们将位置和尺寸值设置为表达式 Inches(1.0)。那是什么呢?

在内部,PowerPoint 以英语公制单位(English Metric Units,简称 EMU)存储长度值。这个术语可能值得我们在谷歌上搜索一下,但简而言之,EMU 是长度的整数单位,914400 立方英寸。Office 文档中的大部分长度都存储在 EMU 中。914400 的优点是它可以被许多公因数整除,例如,可以在英寸和厘米之间进行精确换算。作为一个整数,它可以跨序列化和平台准确地表示。

你可以想象,直接在 EMU 工作是不方便的。为了让它更简单,python-pptx 提供了一个值类型集合,以方便地规范和转换为便利的单位:

>>> from pptx.util import Inches, Pt
>>> length = Inches(1)
>>> length
914400
>>> length.inches
1.0
>>> length.cm
2.54
>>> length.pt
72.0
>>> length = Pt(72)
>>> length
914400

更多细节可以在 pptx.util 的 API 文档 中找到

形状位置和维度

所有形状在其 slide 上都有位置和大小。通常,位置和大小是在创建形状时指定的。位置和大小也可以从现有的形状和改变:

>>> from pptx.enum.shapes import MSO_SHAPE
>>> left = top = width = height = Inches(1.0)
>>> shape = shapes.add_shape(
>>>     MSO_SHAPE.ROUNDED_RECTANGLE, left, top, width, height
>>> )
>>> shape.left, shape.top, shape.width, shape.height
(914400, 914400, 914400, 914400)
>>> shape.left.inches
1.0
>>> shape.left = Inches(2.0)
>>> shape.left.inches
2.0

填充

自动形状的外部边缘有轮廓。在这个轮廓中出现的东西叫做形状的填充。

最常见的填充类型是纯色。形状也可以用渐变填充,图片,模式(比如交叉填充),或者没有填充(透明填充)。

当使用 color 时,它可能被指定为特定的 RGB 值或来自主题调色板的颜色。

因为有很多选项,所以填充的 API 有点复杂。这段代码将形状的填充设置为红色:

>>> fill = shape.fill
>>> fill.solid()
>>> fill.fore_color.rgb = RGBColor(255, 0, 0)

将其设置为在工具栏调色板中显示为 ‘Accent 1 - 25% Darker’ 的主题颜色:

>>> from pptx.enum.dml import MSO_THEME_COLOR
>>> fill = shape.fill
>>> fill.solid()
>>> fill.fore_color.theme_color = MSO_THEME_COLOR.ACCENT_1
>>> fill.fore_color.brightness = -0.25

将形状填充设置为透明,或 ‘No fill’ 在 PowerPoint UI 中是这样的:

>>> shape.fill.background()

如您所见,第一步是通过调用 fill 上的相应方法来指定所需的填充类型。这样做实际上改变了填充对象上可用的属性。例如,引用 .fore_color 调用填充对象的 .background() 方法后,将引发异常:

>>> fill = shape.fill
>>> fill.solid()
>>> fill.fore_color
<pptx.dml.color.ColorFormat object at 0x10ce20910>
>>> fill.background()
>>> fill.fore_color
Traceback (most recent call last):
  ...
TypeError: a transparent (background) fill has no foreground color

线

自动形状的轮廓也可以格式化,包括设置其颜色、宽度、虚线(实线、虚线、虚线等)、线样式(单线、双线、厚-薄线等)、尾端、连接类型等。::在编写时,可以使用 python-pptx 设置颜色和宽度

>>> line = shape.line
>>> line.color.rgb = RGBColor(255, 0, 0)
>>> line.color.brightness = 0.5  # 50% lighter
>>> line.width = Pt(2.5)

主题颜色也可以在线条上使用:

>>> line.color.theme_color = MSO_THEME_COLOR.ACCENT_6

Shape.line 具有 .color 属性。这本质上是快捷方式:

>>> line.fill.solid()
>>> line.fill.fore_color

这对于线格式很有意义,因为形状轮廓通常被设置为纯色。需要直接访问填充,例如,将该行设置为 transparent:

>>> line.fill.background()

线宽

形状轮廓还有读/写宽度属性:

>>> line.width
9525
>>> line.width.pt
0.75
>>> line.width = Pt(2.0)
>>> line.width.pt
2.0

调整自动形状

“许多自动形状都可以调整。在 PowerPoint 中,这些会显示为黄色的小方块,你可以拖动来改变形状的外观。通过程序处理它们有点棘手,但如果你有耐心把它们做对,你可以以非常精确的方式实现一些显著的效果。

形状调整概念

在进行认真的调整工作之前,有一些概念是值得掌握的。

首先,调整是针对特定的自动形状类型。每个自动形状有 0 到 8 个调整。它们的作用是任意的,取决于形状设计。

从概念上讲,调整是一种指导,在很多方面,比如你可以在 PowerPoint UI 和其他绘图应用程序中对齐的淡蓝色。它们不会显示出来,但它们以相似的方式运作,每一个都定义了 x 或 y 值,该形状的一部分将对齐,改变形状的比例。

调整值是大整数,每一调整值以 100,000 的名义值为基础。调整的有效值与形状的宽度或高度成比例。因此 x 坐标调整值为 50,000 对应于形状宽度的一半;y 坐标调整值为 75000 相当于形状高度的 3/4。

调整值可以是负的,通常表示坐标在左边或在形状的左上角(原点)以上。值也可以受限制,这意味着它们的有效值不能超出规定的范围。实际上,这相当于一个点不能延伸到形状的左边。

花些时间在幻灯片上调整形状,这是很好的时间,可以建立一个直观的感觉,了解他们的行为。您还可能希望安装 opc-diag,这样您就可以查看由不同的调整生成的 XML 值,作为开发您的调整代码的开始。

下面的代码使用调整来格式化 callout 形状:

callout_sp = shapes.add_shape(
    MSO_SHAPE.LINE_CALLOUT_2_ACCENT_BAR, left, top, width, height
)

# get the callout line coming out of the right place
adjs = callout_sp.adjustments
adjs[0] = 0.5   # vert pos of junction in margin line, 0 is top
adjs[1] = 0.0   # horz pos of margin ln wrt shape width, 0 is left side
adjs[2] = 0.5   # vert pos of elbow wrt margin line, 0 is top
adjs[3] = -0.1  # horz pos of elbow wrt shape width, 0 is margin line
adjs[4] = 3.0   # vert pos of line end wrt shape height, 0 is top
a5 = adjs[3] - (adjs[4] - adjs[0]) * height/width
adjs[5] = a5    # horz pos of elbow wrt shape width, 0 is margin line

# rotate 45 degrees counter-clockwise
callout_sp.rotation = -45.0