Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python pptx python pptx PowerPoint幻灯片构建--理解模式/构建方法时遇到问题_Python Pptx - Fatal编程技术网

Python pptx python pptx PowerPoint幻灯片构建--理解模式/构建方法时遇到问题

Python pptx python pptx PowerPoint幻灯片构建--理解模式/构建方法时遇到问题,python-pptx,Python Pptx,我想从头开始自动构建PowerPoint幻灯片,这是Python中执行的许多smarts所需的输出格式 然而,我在理解python pptx文档时遇到了困难;它似乎遵循了一种与我所期望的完全不同的模式,可能是基于我对tikz图形输出所做的大量工作。大多数文档更关注于处理现有的powerpoint文档、提取文本和表格数据、添加幻灯片、批量编辑标题等 下面是我试图构建PowerPoint幻灯片组件的伪代码版本,对应的图形版本包括在下面。从某种意义上说,它构建组件(形状和组)独立于它们以后的使用方式,

我想从头开始自动构建PowerPoint幻灯片,这是Python中执行的许多smarts所需的输出格式

然而,我在理解python pptx文档时遇到了困难;它似乎遵循了一种与我所期望的完全不同的模式,可能是基于我对tikz图形输出所做的大量工作。大多数文档更关注于处理现有的powerpoint文档、提取文本和表格数据、添加幻灯片、批量编辑标题等

下面是我试图构建PowerPoint幻灯片组件的伪代码版本,对应的图形版本包括在下面。从某种意义上说,它构建组件(形状和组)独立于它们以后的使用方式,然后将它们添加到幻灯片末尾

def rectshape(dikt):
    shp = initiate_shape(MSO_SHAPE.RECTANGLE)
    # width, height, fill, border, text, font_color, etc:
    for k, v in dikt.items():
        setattr(shp, k, v)

    return(sh)

title_shape_attr = {
    'text': None
    , 'fill': 'dark blue'
    , 'font_color': 'white'
    , 'width': Mm(25)
    # etc
}
fish_shape_attr = {
    # same idea as above
}
text_shape_attr = {
    # same ideas as above
}

def build_group(t1, t2, t3):
    title_shape_attr['text'] = t1
    fish_shape_attr['text'] = t2
    text_shape_attr['text'] = t3

    s1 = rectshape(title_shape_attr)
    s2 = rectshape(fish_shape_attr)
    s3 = rectshape(text_shape_attr)      

    grp = Group()
    grp.add_shape(s1, left=Mm(0), top=Mm(0))
    grp.add_shape(s2, left=Mm(0), top=Mm(25))
    grp.add_shape(s3, left=Mm(0), top=Mm(50))

    return(grp)

g1 = build_group('Title A', 'One Fish', 'Text T')
g2 = build_group('Title B', 'Two Fish', 'Text E')
g3 = build_group('Title C', 'Red Fish', 'Text X')
g4 = build_group('Title D', 'Blue Fish', 'Text T')

prs = Presentation()
slide = prs.slides.add_slide(prs.slide_layouts[5])
slide.shapes.add_shape(g1, left = Mm(50), top = Mm(20))
slide.shapes.add_shape(g2, left = Mm(80), top = Mm(20))
slide.shapes.add_shape(g3, left = Mm(110), top = Mm(20))
slide.shapes.add_shape(g4, left = Mm(140), top = Mm(20))

然而,我想我发现这与python pptx构建幻灯片的方式相反——我需要从幻灯片开始,然后添加一个组,同时定义位置/大小,然后再次使用位置和大小将形状添加到组中,并且只有在所有设置完成后,我回到所有的形状和组,改变属性和文本

例如,在rectshape函数中尝试
shp=Shape(MSO_Shape.RECTANGLE)
时会给出TypeError:init()缺少1个必需的位置参数:'父级'——建议在我创建它之前,该形状需要属于其他形状

TypeError: init() missing 1 required positional argument: 'parent' 到目前为止,我的任何尝试都不足以包含“到目前为止我所尝试的”,并且只会真正混淆问题


有谁能帮助我们勾勒出如何从一组形状中构建幻灯片的一般模式/逻辑吗?

理解它的一种方法可能是考虑自己使用PowerPoint,使用UI。首先打开演示文稿,然后添加幻灯片,然后向幻灯片添加形状。API遵循此模型

在有幻灯片之前不能添加形状,在有演示文稿之前不能添加幻灯片等。一旦有形状,可以更改其属性

所以你需要这样组织你的逻辑。您只需要从pptx导入演示文稿;好的,还有枚举和长度说明符实用程序等,但没有其他对象,如幻灯片、形状或图片。你从来没有机会构建一个这样你就不需要这个类了。通过调用
slide=prs.add\u slide()
可以从演示文稿中获得幻灯片。您可以通过调用
shape=slide.add_shape()
等来获得一个新的形状。除了演示之外,没有其他“松散”对象的概念。所有其他PowerPoint域实体从创建时起就保存在演示文稿对象层次结构(演示文稿-- 如果您需要进行逻辑运算,事先计算出幻灯片上的内容、有多少项等,也许要知道幻灯片上的对象的位置以及它们的大小,您需要一个中间表示,然后您可以遍历它来进行实际的书写,或者,您允许逻辑对象在调用
.render()
或其他内容时写入自己,并将对幻灯片的引用传递给它们,以便在上面写入自己。我做过一些复杂的财政日历布局,它们以这种方式工作,需要做很多自己的事情,比如每个块应该是什么颜色,它们有多大,它们之间的间距是多少等等,所有这些基本上都是从数据库中提取的数据驱动的

关于
GroupShape
对象,它们在python pptx中是全新的(可能是一个月前),如何使用它们是另一个问题。但从这里的文档中应该不难看出:


基本上,您可以调用
group\u shape=shapes.add\u group\u shape()
。然后,您可以使用在幻灯片上使用的相同方法将形状添加到组形状中。形状(例如,
.add_picture()
),或者您可以将一系列现有形状作为
的参数传递。add_group_shape()
将这些形状“分组”到返回的组形状中。无论哪种方式,您都可以逐个添加所有形状;您可以选择是先创建组,还是在组内创建形状。

非常感谢@scanny,我在您的指导下取得了一些进展。干杯