[Python] Python PPTX Internal Hyperlinks workaround function

Discussão em 'Python' iniciado por Stack, Agosto 1, 2025.

  1. Stack

    Stack Membro Participativo

    I tried to follow example as discussed in https://groups.google.com/forum/#!topic/python-pptx/nrUkiQQHyZo , however ended up with an error 'Slide' object has no attribute 'rels'.

    The minimal code I'm experimenting tries to build a hyperlink in first slide to third slide.

    import pptx
    import pptx.enum
    from pptx import Presentation
    from pptx.enum.action import PP_ACTION
    from pptx.opc.constants import RELATIONSHIP_TYPE as RT

    #very minimal Powerpoint template
    prs = Presentation("tpl.pptx")

    # create 3 slides, each with single text placeholder
    s1 = prs.slides.add_slide(prs.slide_layouts[0])
    s2 = prs.slides.add_slide(prs.slide_layouts[0])
    s3 = prs.slides.add_slide(prs.slide_layouts[0])

    # create internal hyperlink
    rId = s1.part.relate_to(s3, RT.SLIDE)
    r = s1.placeholders[10].text_frame.paragraphs[0].add_run()
    r.text = "Link to Slide 3"
    rPr = r._r.get_or_add_rPr()

    hlinkClick = rPr.add_hlinkClick(rId)
    hlinkClick.set('action', 'ppaction://hlinksldjump')

    # ERROR WHEN SAVING - Slide' object has no attribute 'rels #
    prs.save("Test.pptx")


    How to resolve the error? Or perhaps, is there a simpler way to achieve this?

    EDIT: Full Stack Trace

    AttributeError Traceback (most recent call last)
    <ipython-input-2-60361164c736> in <module>()
    23
    24 # ERROR WHEN SAVING - Slide' object has no attribute 'rels #
    ---> 25 prs.save("Test.pptx")

    C:\Users\x\Anaconda3\lib\site-packages\pptx\presentation.py in save(self, file)
    44 to a file (a string) or a file-like object.
    45 """
    ---> 46 self.part.save(file)
    47
    48 @property

    C:\Users\x\Anaconda3\lib\site-packages\pptx\parts\presentation.py in save(self, path_or_stream)
    116 object.
    117 """
    --> 118 self.package.save(path_or_stream)
    119
    120 def slide_id(self, slide_part):

    C:\Users\x\Anaconda3\lib\site-packages\pptx\opc\package.py in save(self, pkg_file)
    162 a file (a string) or a file-like object.
    163 """
    --> 164 for part in self.parts:
    165 part.before_marshal()
    166 PackageWriter.write(pkg_file, self.rels, self.parts)

    C:\Users\x\Anaconda3\lib\site-packages\pptx\opc\package.py in parts(self)
    139 package.
    140 """
    --> 141 return [part for part in self.iter_parts()]
    142
    143 def relate_to(self, part, reltype):

    C:\Users\x\Anaconda3\lib\site-packages\pptx\opc\package.py in <listcomp>(.0)
    139 package.
    140 """
    --> 141 return [part for part in self.iter_parts()]
    142
    143 def relate_to(self, part, reltype):

    C:\Users\x\Anaconda3\lib\site-packages\pptx\opc\package.py in iter_parts(self)
    54 yield part
    55
    ---> 56 for part in walk_parts(self):
    57 yield part
    58

    C:\Users\x\Anaconda3\lib\site-packages\pptx\opc\package.py in walk_parts(source, visited)
    51 yield part
    52 new_source = part
    ---> 53 for part in walk_parts(new_source, visited):
    54 yield part
    55

    C:\Users\x\Anaconda3\lib\site-packages\pptx\opc\package.py in walk_parts(source, visited)
    51 yield part
    52 new_source = part
    ---> 53 for part in walk_parts(new_source, visited):
    54 yield part
    55

    C:\Users\x\Anaconda3\lib\site-packages\pptx\opc\package.py in walk_parts(source, visited)
    51 yield part
    52 new_source = part
    ---> 53 for part in walk_parts(new_source, visited):
    54 yield part
    55

    C:\Users\x\Anaconda3\lib\site-packages\pptx\opc\package.py in walk_parts(source, visited)
    42 """
    43 def walk_parts(source, visited=list()):
    ---> 44 for rel in source.rels.values():
    45 if rel.is_external:
    46 continue

    AttributeError: 'Slide' object has no attribute 'rels'

    Continue reading...

Compartilhe esta Página