Python - Попытка вызова функции из другого файла (используя python-pptx) - PullRequest
0 голосов
/ 08 февраля 2019

У меня есть скрипт Python, который использует модуль python-pptx для генерации колоды Powerpoint.Код выполняет более 300 строк кода из-за различного форматирования.Поэтому я планирую разделить на несколько подфункций, чтобы их было легко поддерживать в будущем.

Ниже приведен пример того, что я пробовал:

Создана подфункция с именем sub_func() как показано ниже

def sub_func():
    # create presentation with 1 slide ------
    prs = Presentation()
    slide = prs.slides.add_slide(prs.slide_layouts[5])

    # define chart data ---------------------
    chart_data = CategoryChartData()
    chart_data.categories = ['Zone1', 'Zone2', 'Zone3']
    chart_data.add_series('Series 1', (19.2, 21.4, 16.7))

    # add chart to slide --------------------
    x, y, cx, cy = Inches(2), Inches(2), Inches(6), Inches(4.5)
    slide.shapes.add_chart(
XL_CHART_TYPE.COLUMN_CLUSTERED, x, y, cx, cy, chart_data
    )
    prs.save('chart-00.pptx')

Сохранено вышеизложенное в sub_func.py

Ниже приводится моя основная функция:

from pptx import Presentation
from pptx.chart.data import CategoryChartData
from pptx.enum.chart import XL_CHART_TYPE
from pptx.util import Inches
from sub_func import sub_func

def func():
    # create presentation with 1 slide ------
    prs = Presentation()
    slide = prs.slides.add_slide(prs.slide_layouts[5])

    # define chart data ---------------------
    chart_data = CategoryChartData()
    chart_data.categories = ['East', 'West', 'Midwest']
    chart_data.add_series('Series 1', (19.2, 21.4, 16.7))

    # add chart to slide --------------------
    x, y, cx, cy = Inches(2), Inches(2), Inches(6), Inches(4.5)
    slide.shapes.add_chart(
XL_CHART_TYPE.COLUMN_CLUSTERED, x, y, cx, cy, chart_data
    )
    ##Calling the sub-function below

    sub_func()

    prs.save('chart-01.pptx')

Это выше генерирует файл PowerPoint, но делаетне выполнять подфункцию.Может ли кто-нибудь посоветовать, где я иду не так.

Отредактированный код:

from pptx import Presentation
from pptx.chart.data import CategoryChartData
from pptx.enum.chart import XL_CHART_TYPE
from pptx.util import Inches
from subfolder import func1
from pptx.parts.chart import ChartPart
from pptx.parts.embeddedpackage import EmbeddedXlsxPart

def func():
    # create presentation with 1 slide ------
    prs = Presentation()
    slide = prs.slides.add_slide(prs.slide_layouts[5])

    # define chart data ---------------------
    chart_data = CategoryChartData()
    chart_data.categories = ['East', 'West', 'Midwest']
    chart_data.add_series('Series 1', (19.2, 21.4, 16.7))

    # add chart to slide --------------------
    x, y, cx, cy = Inches(2), Inches(2), Inches(6), Inches(4.5)
    slide.shapes.add_chart(XL_CHART_TYPE.COLUMN_CLUSTERED, x, y, cx, cy,chart_data)

    ##Calling the sub-function below

    def Add_Slide(self):
        xml_slides = prs.slides._sldIdLst
        xml_slides1 = prs1.slides._sldIdLst
        slides = list(xml_slides)
        slides1 = list(xml_slides1)
        xml_slides.append(xml_slides1)

    prs.save('chart-01.pptx')

Ниже приводится подфункция:

from pptx import Presentation
from pptx.chart.data import CategoryChartData
from pptx.enum.chart import XL_CHART_TYPE
from pptx.util import Inches


def func1():
    # create presentation with 1 slide ------

    prs1 = Presentation()
    slide = prs1.slides.add_slide(prs1.slide_layouts[5])

    # define chart data ---------------------
    chart_data = CategoryChartData()
    chart_data.categories = ['East', 'West', 'Midwest']
    chart_data.add_series('Series 1', (100.2, 21.4, 16.7))

    # add chart to slide --------------------
    x, y, cx, cy = Inches(2), Inches(2), Inches(6), Inches(4.5)
    slide.shapes.add_chart(XL_CHART_TYPE.COLUMN_CLUSTERED, x, y, cx, cy,chart_data)

Используя приведенный выше отредактированный код, я вижу, что основная функция выполняется, но подфункция не выполняется, потому что у нее нет prs.save для подфункции.Не могли бы вы, пожалуйста, совет ..

Ответы [ 3 ]

0 голосов
/ 08 февраля 2019
from .sub_func import sub_func
0 голосов
/ 08 февраля 2019

Не думаю, что проблема связана с инструкциями импорта.Вы повторно инициализируете объект представления снова в sub_module.

prs = Presentation()

вы можете передать объект prs в sub_func, как показано ниже, и попробовать, если проблема будет решена

основная функция

from pptx import Presentation
from pptx.chart.data import CategoryChartData
from pptx.enum.chart import XL_CHART_TYPE
from pptx.util import Inches
from sub_func import sub_func

def func():
    # create presentation with 1 slide ------
    prs = Presentation()
    slide = prs.slides.add_slide(prs.slide_layouts[5])

    # define chart data ---------------------
    chart_data = CategoryChartData()
    chart_data.categories = ['East', 'West', 'Midwest']
    chart_data.add_series('Series 1', (19.2, 21.4, 16.7))

    # add chart to slide --------------------
    x, y, cx, cy = Inches(2), Inches(2), Inches(6), Inches(4.5)
    slide.shapes.add_chart(XL_CHART_TYPE.COLUMN_CLUSTERED, x, y, cx, cy,chart_data)

    ##Calling the sub-function below

    sub_func(prs)

    prs.save('chart-01.pptx')

и в sub_func внесите изменения, как показано ниже

def sub_func(prs):
    # create presentation with 1 slide ------
    # prs = Presentation() -------Remove this line
    slide = prs.slides.add_slide(prs.slide_layouts[5])

    # define chart data ---------------------
    chart_data = CategoryChartData()
    chart_data.categories = ['Zone1', 'Zone2', 'Zone3']
    chart_data.add_series('Series 1', (19.2, 21.4, 16.7))

    # add chart to slide --------------------
    x, y, cx, cy = Inches(2), Inches(2), Inches(6), Inches(4.5)
    slide.shapes.add_chart(
XL_CHART_TYPE.COLUMN_CLUSTERED, x, y, cx, cy, chart_data
    )
    prs.save('chart-00.pptx')
0 голосов
/ 08 февраля 2019

это sub_func.py в вашем пути Python?Если он находится только в вашем рабочем каталоге, это, скорее всего, приведет к ModuleNotFoundError.Вам нужно будет использовать относительный импорт , затем

from .sub_func import sub_func

Если это не проблема, а только тот факт, что это не имеет никакого эффекта, то это потому, что выне сказал это, чтобы иметь эффект.Создает презентацию с 1 слайдом, но не сохраняет ее.Он не возвращается методом, а возвращаемое значение не фиксируется переменной

...