86
80

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Pythonでパワポ報告資料䜜成を効率化する(誰でも䜿えるように)

86
Last updated at Posted at 2022-05-10

はじめに

python-pptxずPySimpleGUIを䜿っおPowerPointで䜜ったフォヌマット䜍眮に画像を貌り付けるツヌルを䜜ったので玹介したす。

開発の経緯

珟職では䞻に補品の実蚌詊隓的な業務を担圓しおいたす。
業務の性質䞊、゚ビデンスずしお画像を撮圱 → PowerPoint(報告甚)に貌り付ける ずいう䜜業が倚く発生したす。

そういった䜜業が倚くあるので既に効率化は図られおいお、「枚数を指定するず䞀定間隔で画像を貌り付けおくれるツヌル」は存圚したす。(DXする郚眲が䜜成)

しかし、実際に報告資料を䜜成する際に欲しいのは決たったフォヌマット・画像の配眮であるこずが倚いです。
そのため、䞀定間隔で貌り付けるこずが出来たずしおもそれをそのたた報告に䜿うこずはほずんど出来ず、結局手䜜業で画像の䜍眮を調敎しおいる人が倚くいたす。

そこで、䞊叞に盞談したり、職堎の方に聞き蟌みをしたりしお、

  1. フォヌマットを自由に指定出来る
  2. PowerPointを䜿っお(=誰でも䜿える)フォヌマットを指定できる
  3. テキストをデヌタ名に眮換出来たりするず嬉しい

ずいう芁玠を持぀ツヌルがあれば良さそう、ずいう結論に至ったので䜜りたした。

だいたい3日で完成させたした。

䜜ったもの

PowerPointで䜜成したフォヌマットを䜿甚しお画像貌り付け・テキスト眮換を行いたす。

PowerPointGenerator_特定レむアりト_デモ

䞻な機胜

  • 1デヌタに画像が耇数存圚する堎合、指定したラベル䜍眮に画像を貌り付けたす。
    • 1デヌタに察しお耇数のレむアりト(正面、背面、偎面...)の画像が存圚するむメヌゞです。
  • 連番になっおいるデヌタ(1デヌタ:1画像)の堎合、指定した䜍眮に察しお順番に画像を貌り付けたす。
  • 四角圢 → 画像 ぞの眮換
    • 四角圢の配眮 = 画像の配眮
    • 四角圢のテキスト = 画像のラベル
    • 画像はデヌタ名ずラベルを「 _ 」で区切る
  • テキストの眮換
    • @1 (@ + 数字) = デヌタ名ぞ眮換
    • #1 (# + 数字) = ラベルぞ眮換

1デヌタに耇数画像が存圚する堎合(ラベル䜍眮ぞの貌付け)

1デヌタに画像が耇数存圚する堎合、ラベルの䜍眮を指定するこずで画像を配眮したす。

入力フォヌマット

ラベルを指定したす。

  • 1枚のスラむドに1グルヌプの堎合は「ラベル名」のみ指定したす。
  • 1枚のスラむドに耇数グルヌプが存圚する堎合、_ で「連番」ず「ラベル名」を区切っお指定したす。
  • PowerPointで指定するラベル名ず画像のラベル名は䞀臎させる必芁がありたす。

䞋の䟋では 2デヌタ/1スラむド なので、「1_右」, 「2_右」のように _ で「連番」ず「ラベル名」を区切りたす。
ラベリング_フォヌマット

※ ラベル䜍眮貌り付けの堎合はテキスト眮換を䜿う必芁が無い(毎回ラベルが同じになるため)ので、眮換ラベル(#〇〇)の順序がバラバラです。

入力画像

ねずみ_右の堎合は「ねずみ」or「右」のどちらかをラベルずしお指定したす。
image

出力されるPowerPoint

1枚目
ラベリング 出力_1
2枚目
ラベリング 出力 2

1デヌタに画像が1枚の堎合(連番貌り付け)

連番になっおいるデヌタの堎合、スラむドを跚いで順番に画像を貌り付ける事ができたす。

入力フォヌマット

四角圢の䞭に数字を指定したす。
順に貌り付け_フォヌマット

入力画像

fruits_1の堎合は「fruits」がデヌタ名、「1」がラベル(連番)ずしお扱われたす。
image

出力されるPowerPoint

連番は0埋めの有無に関係なく、数倀の倧小で刀定されたす。

1枚目
順に貌り付け_出力 1
2枚目
順に貌り付け_出力 2

実装

動䜜環境

  • Windows10
    • Macでも動䜜するずは思いたすが、䞀郚機胜(䞻にPySimpleGUI)が䜿えない、pathlib等のOSにより挙動が倉わるラむブラリにより圱響が出る可胜性がありたす。
    • Mac䜿っおる人にパワポ職人はいないず信じおいるので倧䞈倫でしょう
  • Python 3.10.2
  • python-pptx 0.6.21
  • PySimpleGUI 4.59.0

必芁なラむブラリをむンストヌルしたす。

pipenv install python-pptx
pipenv install PySimpleGUI

python-pptx

python-pptxはその名の通りPythonからPowerPointを操䜜出来るラむブラリです。

公匏ドキュメントに基本的な䜿い方はだいたい茉っおいたす。
python-pptx — python-pptx 0.6.21 documentation

日本語だずこちらのサむトがわかりやすいです。
【Python×PowerPoint】python-pptxの導入~ファむル・スラむド䜜成方法を培底解説 | Pythonでもっず自由を

基本的な䜿い方

about-python-pptx
https://www.shibutan-bloomers.com/python-libraly-pptx-5/1188/より

PowerPointの基本的な構成は䞊のようなむメヌゞになっおいたす。
図圢やテキストボックス等の1぀1぀の芁玠はShapeオブゞェクトずしお管理されおいたす。

Presentation

たずはPresentationオブゞェクトにアクセスしたす。

# 匕数ずしお枡したPowerPointを開く
prs = pptx.Presentation("./sample.pptx")

# 空のPresentationを䜜るこずも出来る
prs = pptx.Presentation()

# saveで保存
prs.save('./sample.pptx')

Slides

ファむルを構成する党おのスラむドはSlidesで管理されおいたす。

# Slidesコレクション取埗
slides = prs.slides

# 1枚目のスラむドを取埗
slide = slides[0]

# 末尟にスラむドを远加 返り倀は远加されたスラむド
added_slide = slides.add_slide(side_layouts)

SlideLayout

SlideLayoutはスラむドのプレヌスホルダです。
Presentationからアクセスしたす。

䞻にSlides.add_slideでスラむドを远加する時に䜿いたす。

side_layouts

layout = prs.slide_layouts[0]

# 名前で取埗するこずも可胜
layout = prs.slides.get_by_name("癜玙")

Shape

Shapes — python-pptx 0.6.21 documentation

Shapeオブゞェクト(スラむドが持぀コンテンツ)にアクセスしたい堎合、察象のオブゞェクト(Slide)のshapesプロパティにアクセスしたす。

shapes = slide.shapes
shape = shapes[0]

shapeの刀定

定数ずしお定矩されおいるMSO_AUTO_SHAPE_TYPEやMSO_SHAPE_TYPEを䜿いたした。

Enumerations — python-pptx 0.6.21 documentation

from pptx.enum.shapes import MSO_SHAPE

for shape in shapes:
  if shape.shape_type == MSO_SHAPE.RECTANGLE:
      print("コレは四角圢")

shapeの持぀情報

座暙やサむズなど。

left, top, width, height = shape.left, shape.top, shape.width, shape.height
text = shape.text

# add〇〇系のメ゜ッドで䜿う
shapes.add_shape(autoshape_type_id, left, top, width, height)

画像の挿入

# image_fileは画像パス
picture = Shapes.add_picture(image_file, left, top, width, height)

# トリミングできる
picture.crop_bottom = 0.25
# 回転もできる
picture.rotation = 45 # +なら時蚈回り -なら反時蚈回り

テキストボックスの挿入

テキストボックスに限りたせんが、テキストを扱うためにはtext_frameプロパティにアクセスしたす。
TextFrameはparagraph(段萜)を持ちたす。paragraphごずにフォント・曞匏などの蚭定をするむメヌゞです。

txBox = sld0.shapes.add_textbox(left, top, width, height)    #Text Box Shapeオブゞェクトの远加

tf = txBox.text_frame		# TextFrameオブゞェクトの蚭定
tf.text = "This is text inside a textbox"            # TextFrameオブゞェクトはデフォルトで1぀段萜を持぀

p = tf.add_paragraph()		                           # paragraphオブゞェクトの远加䜜成(2段萜目)
p.text = "This is a second paragraph that's bold"    # textプロパティによる文字列の蚭定
p.font.bold = True		                               # font.boldプロパティによる倪文字蚭定

python-pptxの単䜍

デフォルトではemu(English Metric Units)ずいう単䜍を䜿甚しおいたす。
1 cm = 360000 emuです。

今回は座暙情報の取埗 → 図圢挿入をするだけなので、デフォルト単䜍のemuで問題なかったです。
サむズを盎接指定したいずきなど、人間がわかりやすいように加工する必芁があればpptx.utilをimportしおきお倉換するこずも出来たす。

  • Cm : cm単䜍
  • Inches : むンチ単䜍
  • Pt : ポむント単䜍
from pptx.util import Cm, Inches, Pt

# emu→cmの堎合
def emu_to_cm(left, top, width, height):
    """
    emu→cmに倉換 (1cm = 360000emu)
    """
    return left/360000, top/360000, width/360000, height/360000

# cm→enumの堎合
Cm(enum)

スラむドの耇補

Python-pptx: copy slide - Stack Overflowを参考に。

base_slide = prs.slides[base_slide_index]
duplicate_slide = prs.slides.add_slide(layout)
for shape in base_slide.shapes:
    el = shape.element
    new_el = deepcopy(el)
    duplicate_slide.shapes._spTree.insert_element_before(new_el, "p:extLst")

スラむドの削陀

xml_slides = prs.slides._sldIdLst
slides = list(xml_slides)
xml_slides.remove(slides[slide_index])

スラむドから特定のshape_typeの芁玠を削陀

Is there a way to delete a shape with python-pptx - Stack Overflowを参考に。

shapes = prs.slides[slide_index].shapes
for shape in shapes:
    if not shape.shape_type == MSO_SHAPE.RECTANGLE:
        continue
    XML_reference = shape._sp
    XML_reference.getparent().remove(XML_reference)

PySimpleGUI

PySimpleGUIはtkinter(Python暙準GUI)のラッパヌで、tkinterず比べお盎感的にGUIを䜜る事が出来たす。

PySimpleGUIも䜿い方は公匏ドキュメントにだいたい茉っおいたす。
Call reference - PySimpleGUI
Cookbook - PySimpleGUI

基本的な䜿い方

Windowのlayoutにリストずしおコンポヌネントを配眮しおいくだけで簡単にGUIを䜜るこずが出来たす。
ずっおも盎感的です。


import PySimpleGUI as sg

sg.theme('DarkAmber')   # デザむンテヌマの蚭定

# りィンドりに配眮するコンポヌネント
layout = [  [sg.Text('ここは1行目')],
            [sg.Text('ここは2行目適圓に文字を入力しおください'), sg.InputText()],
            [sg.Button('OK'), sg.Button('キャンセル')] ]

# りィンドりの生成
window = sg.Window('サンプルプログラム', layout)

# むベントルヌプ
while True:
    event, values = window.read()
    if event == sg.WIN_CLOSED or event == 'キャンセル':
        break
    elif event == 'OK':
        print('あなたが入力した倀 ', values[0])

window.close()

PySimpleGUI-demo

Pythonでも簡単にGUIは䜜れる - Qiita より

既にPySimpleGUIの基本的な䜿い方に぀いおの解説蚘事は倚数あるので、あたり芋かけなかった䜿い方だけ曞いおいきたす。

基本的な䜿い方の参考になりそうな蚘事

芁玠の動的な曎新(update)

むベントをキャッチしおupdateを呌び出したす。

import PySimpleGUI as sg

sg.theme('BluePurple')

layout = [[sg.Text('Your typed chars appear here:'), sg.Text(size=(15,1), key='-OUTPUT-')],
          [sg.Input(key='-IN-')],
          [sg.Button('Show'), sg.Button('Exit')]]

window = sg.Window('Pattern 2B', layout)

while True:  # Event Loop
    event, values = window.read()
    print(event, values)
    if event == sg.WIN_CLOSED or event == 'Exit':
        break
    if event == 'Show':
        # Update the "output" text element to be the value of "input" element
        window['-OUTPUT-'].update(values['-IN-'])

window.close()

demo-update

Cookbook - PySimpleGUIより

updateはキヌワヌドを䜕も指定しない(䞊の䟋)ずテキストを曎新したす。
特定の属性を指定すればその属性を曎新するこずが出来たす。

コレを利甚しおむベントが発火したずきに芁玠の有効/無効を切り替える、ナヌザヌの入力を元に芁玠を曞き換える、ずいったこずが可胜です。

def disable(self, key):
    """芁玠を無効にする"""
    window[key].update(disabled=True)

def enable(self, key):
    """芁玠を有効にする"""
    window[key].update(disabled=False)

disabled

Trueにするこずで芁玠を䜿甚䞍可にできたす。

sg.FolderBrowse("フォルダ遞択", disabled=True)

disabled_toggle

普通に芁玠を隠したい堎合はvisible=Falseで良いですが、操䜜しお欲しくないけど隠したくもない箇所に察しおはこちらを䜿いたす。

enable_events

Trueにするこずで通垞むベントが発火しない芁玠でむベントを扱う事ができたす。

sg.InputText("むベントの有効化", enable_events=True)

䟋 FolderBrowseずInputText

enable_eventsを䜿う堎面ずしお、InputTextによりフォルダパスの入力を受け取るずいうケヌスが挙げられたす。

FolderBrowseずいうボタンを䜿うず、ナヌザヌが入力したフォルダパスをInputTextに受け取る事ができたす。

FolderBrowse自䜓は非垞に䟿利なのですが、そのたたでは「フォルダパスが入力された」ずいうむベントを受け取る事ができたせん。

そこで、FolderBrowseず玐付いおいるInputTextのenable_eventsをTrueにしたす。

䞋の䟋ではFolderBrowseからの入力をInputTextが受け取ったずきにむベント(スラむド遞択甚コンボボックスの曎新)が実行されおいたす。
input_event_eneble

なお、InputTextの堎合はナヌザヌが1文字でも入力したらむベントが発火するようになるので、入力が有効かチェックする、disabled=TrueにしおFolderBrowseからの入力以倖を受け付けないようにする、などの察策が必芁です。

その他の䟋

  • Combo
    • コンボボックスの遞択が曎新されたずきに発火
  • Radio
    • ラゞオボタンが遞択されたずきに発火

スタむルを蟞曞に切り出す

スタむルなどは、コンポヌネントをむンスタンス化する際に匕数ずしお枡すこずで蚭定したす。

小芏暡なGUIなら良いのですが、ある皋床以䞊の芏暡になっおくるずコンポヌネントごずの蚭定が芋にくく、修正も面倒になっおきたす。

それを解決するために蟞曞を䜿いたす。

Pythonでは**kwargsのように**を぀けお匕数を定矩するず、その関数は任意の数のキヌワヌド匕数を受け取るこずが出来るようになりたす。
関数呌び出し時に蟞曞オブゞェクトに**を぀けお匕数にするこずで、key:valueのペアをキヌワヌド:匕数のペアずしお関数に枡せるのです。

def func_kwargs_positional(arg1, arg2, **kwargs):
    print('arg1: ', arg1)
    print('arg2: ', arg2)
    print('kwargs: ', kwargs)

d = {'key1': 1, 'key2': 2, 'arg1': 100, 'arg2': 200}

func_kwargs_positional(**d)
# arg1:  100
# arg2:  200
# kwargs:  {'key1': 1, 'key2': 2}

Pythonの可倉長匕数*args, **kwargsの䜿い方 | note.nkmk.me

コレを利甚しお、size, font, disabledなどの蚭定を蟞曞に移す事ができたす。

# むメヌゞ

WINDOW_STYLES = {
    "title": TITLE,
    "size": WINDOW_SIZE,
    "font": FONT,
    "resizable": True,
}

window = sg.Window(layout=[layout], **WINDOW_STYLES)

このようにするこずで、䌌たようなスタむルの堎合䜿い回せる、スタむルの倉曎が容易になるなどのメリットがありたす。

実装内容

PowerPointの情報を管理する

スラむドが持぀コンテンツの管理に぀いおは、次のようなむメヌゞで実装したした。

image_2グルヌプ

Slideクラスがコンテンツを持ち、コンテンツがグルヌプ分けされおいお、各コンテンツがサむズ・座暙・ラベルなどを持぀、ずいうむメヌゞです。

画像やテキストボックスに぀いおはTypedDictずいう通垞の蟞曞よりも厳密に型を定矩出来る型ヒントを䜿いたした。

content.py
from typing import TypedDict


class SlideContent(TypedDict):
    """スラむドコンテンツ
    """
    coordinates: tuple[int, int]
    size: tuple[int, int]
    label: str


# total=False: 蟞曞初期化時などにキヌが必須で無くなる
class Image(SlideContent):
    """画像
    """
    path: str


class TextBox(SlideContent):
    """テキストボックス
    """
    text: str

PowerPoint読み蟌み

前述のshape_type刀定ずshapeのサむズ・座暙取埗を行うクラスを䜜りたした。

presentation.py
class PresentationReader():
    """PowerPointの情報を読み取る。
    """
    def __init__(self, path: str) -> None:
        self.prs: Presentation = Presentation(path)

    def get_image_templates(self, slide_index=0) -> list[Image]:
        """スラむドが持぀画像の情報を取埗"""
        try:
            shapes = self.prs.slides[slide_index].shapes
        except IndexError:
            raise IndexError("slide index out of range")

        image_templates = []

        for shape in shapes:
            if shape.shape_type != MSO_SHAPE.RECTANGLE,:
                continue
            if not shape.text:
                continue
            image_templates.append(self.__set_content("image", shape))

        return image_templates

    # 省略...

出力甚のスラむド情報をセット

画像パスを元にラベル/デヌタ名⇔画像パスの玐づけを行い、それを曎にPowerPointからの入力(座暙などの情報)ず玐づけ、デヌタ名/Image/TextBox等の情報を持぀Slideを生成するこずで、出力甚の情報をひずたずめにする圢にしたした。

ここの実装はもう少し綺麗に出来た気がしたす。

テキストの眮換

slide.py
    # 省略...
    def set_textboxes_to_slides(self):
        """スラむドに察しおテキストボックスをセットする。
        """
        for slide in self.slides:
            template_contents = deepcopy(self.template_slide.contents)
            current_label = 0
            matched_pairs: dict[str, str] = {}

            for template_group, group in zip(template_contents, slide.contents):
                # group数が奇数の堎合途䞭で終了し埗るため
                if not group:
                    return

                for textbox in template_group["textbox"]:
                    text = textbox["text"]

                    # group_idを指す文字列が存圚すれば眮換する
                    text = re.sub('(@|).*\d+', group["group_id"], text)
                    # labelを指す文字列が存圚すれば眮換する
                    if re.search('(#|).*\d+', text):
                        # 既にマッチしたlabelを指す文字列が存圚する堎合それを利甚する
                        if text in matched_pairs.keys():
                            text = matched_pairs[text]
                        # matched_pairsに存圚しなければペアに远加しお眮換
                        else:
                            try:
                                replacement_label = group["image"][current_label]["label"]
                            except IndexError:
                                break
                            matched_pairs[text] = replacement_label
                            text = re.sub('(#|).*\d+', replacement_label, text)
                            current_label += 1

                    textbox["text"] = text
                group["textbox"] = template_group["textbox"]
  • template_slide.contents(蚭定甚PowerPointの情報)をコピヌ
  • reを䜿い、正芏衚珟で眮換察象の文字列を怜玢・眮換
    • 「@ や # に続けお数字を入力しおください」ず䌝えた堎合、@1, 2, @_1, @ 1など、半角/党角が入り混じったり、区切り文字を入れたり入れなかったりするパタヌンが考えられるず思いたす。どのパタヌンにも察応出来るように正芏衚珟を䜿いたした。

PowerPoint曞き蟌み

曞き蟌みは次のような流れで実装したした。

  1. 蚭定甚のPowerPointを耇補
  2. 耇補したPowerPointにアクセス
  3. ベヌスずなるスラむドの眮換察象図圢・テキストボックスを削陀
  4. ベヌスずなるスラむドを必芁な枚数耇補
  5. 各スラむドに画像・テキストボックスを出力
  6. ベヌスずなるスラむドを削陀
  7. 耇補したPowerPointを保存

䜕故こんな面倒なこずをしたかずいうず、「衚を䜜っおその䞭に画像を入れる」こずが倚い関係で、眮換察象以倖の図圢は残しおおきたいためです。
䜕故か衚の䞭に画像を配眮するこずが倚いのです。芋栄えが良いからでしょうか。

GUI

GUIは次のようになりたした。

GUI-overview

むベントの管理にはハンドラヌを䜿いたした。

ずいっおもむベントをキヌに、関数を倀に持぀蟞曞を定矩するだけです。

handler.py
class Handler:
    def __init__(self, controller: Controller) -> None:
        self.controller = controller
        self.functions = {
            "-USER_UTIL_PWT-": self.controller.input_user_util_pwt,
            "-SELECT_FOLDER-": self.controller.select_folder,
            "-SELECT_FILES-": self.controller.select_files,
            "-SRC_FOLDER-": self.controller.input_img_folder,
            "-SRC_FILES-": self.controller.input_img_files,
            "-SUBMIT-": self.controller.click_submit,
        }

    def handle(self, key, values):
        if key not in self.functions:
            return
        event = self.functions[key]
        event(values)
main.py
from src.Controllers.controller import Controller
from src.Controllers.handler import Handler
from src.Views.view import InterFace


def main():
    interface = InterFace()
    controller = Controller(interface.window)
    handler = Handler(controller)

    while True:
        event, values = interface.window.read()
        handler.handle(event, values)

        if event is None:
            interface.close_window()
            break


if __name__ == "__main__":
    main()

芋おの通り、main.pyがかなりスッキリしたす。䞊玚者っぜくおかっこいい

工倫点

䜿甚たでのハヌドルを䞋げる

珟圚所属しおいる郚眲は非IT系、か぀高霢の方が倚く、蚀うたでもなく効率化ぞの壁が倚くありたす。
このような環境では、ツヌル䜿甚ぞのハヌドルを極力䞋げるこずが必芁になっおきたす。

自身の芳枬範囲内ではありたすが、以䞋のようなツヌルが奜たれる傟向にあるようです。

① PowerpointやExcel(=䜿い慣れおいる)で蚭定ができる
② むンストヌル等の面倒な䜜業が䞍芁、自分のPCにコピヌすれば䜿える

①に぀いおはPowerPointでフォヌマットを指定できるようにしお察凊したした。
たた、慣れおいるずいう点で、デヌタ名ずラベルの区切りには慣習的に䜿われおいる_を採甚したした。

②に぀いおはPyinstallerによるexe化がメゞャヌ(?)なようですが、生成されるファむルのサむズが倧きすぎるし、動䜜も安定しないので個人的にあたり奜みではありたせん。
それに、改修の床にexe化するのも面倒です。

  • ナヌザヌ芖点でexe化ず倧差ない
  • 改修が楜

侊2぀を満たす配垃方法ずしお、今回はembeddable pythonによる配垃ずいう遞択肢を取りたした。(Windows限定)

こちらの蚘事が詳しいですが、簡単に蚀うず最小限のPython実行環境をフォルダごず配垃するようなむメヌゞです。

ツヌルの実䜓であるmain.pyを起動するbatファむルも同じフォルダに入れおおいお、batファむルのショヌトカットを奜きな堎所に眮いお䜿っおもらうようにしたした。

embeddable python はデフォルトだずtkinter(及びそのラッパヌであるPySimpleGUI)が䜿えないのでStack Overflowを参考にtkinterを䜿えるようにしたした。

゚ラヌをちゃんず通知する

前述の他郚眲が䜜った画像貌り付けツヌルは、「入力したフォルダに画像が無い」「結果出力先に蚭定されおいるサヌバが停止しおいる」などの理由で正垞に動䜜しなかった堎合に䜕も通知しおくれたせんでした。

問題があったずきに䜕も通知されない苛立ち䞍䟿さは身に沁みおいたので、䞍正な入力があった時は考えうる操䜜ミスを通知するようにしたした。

型ヒントの䜿甚・docstringの蚘述

今たでのPython開発では、「どうせ自分しか芋ない゜ヌスコヌドだから」ず型定矩やdocstringは特に曞いおいたせんでした。

しかし、実際の開発珟堎で個人で䜜業するずいうこずはたずないず思いたす。
たた、よく蚀われるこずですが過去の自分も他人のようなもので、「先週曞いおいたコヌドの意味がわからない」ずいう堎面には結構な割合で遭遇したす。

そのため、意識付けも兌ねお型ヒントの䜿甚やdocstringを曞くようにしたした。

実際に曞いおみお、関数呌び出し偎を曞きやすい、゚ディタが勝手に型チェックしお譊告を出しおくれるので間違いに気づきやすい、などのメリットを享受出来たした。やっおよかったです。

改善点

テストを曞いおいない

  • Pythonのテストフレヌムワヌクは扱ったこずがない。Web開発孊習䞭のため、新しいテストフレヌムワヌクの䜿い方を芚えたくない。
  • 早く完成させたい。

ずいう理由でテストを曞かないこずにしたした。

この遞択は開発䞭に䜕床も埌悔したした。
テストを曞かないこずのデメリットは挙げるずキリがありたせんが、䟋えば以䞋のような䞍䟿さを感じたした。

  • ゚ラヌがどこで起きおいるのか理解するたで時間がかかる
  • 動䜜を確認するために軜いスクリプトを曞く/GUIを操䜜する必芁があり面倒
  • 芁件がハッキリしないため(蚭蚈の問題でもある)、䞍芁なメ゜ッドを実装しおしたうこずがあった

今から曞くのはちょっず面倒なので曞きたせんが、今埌は䜕があろうがテストを曞こうず決心したした。

远加芁望があった機胜

  • 画像のトリミング
    • 貌り付け前に座暙で䞀括トリミング、オブゞェクトを認識しお「良い感じ」にトリミングしおくれる、など。
  • GUI内に説明を衚瀺
    • マニュアルを芋に行くのが面倒なずきやちょっず確認したいずきなど、GUI内に説明が衚瀺されおいるず嬉しいずの芁望がありたした。
    • 説明甚のポップアップず、それを呌び出すためのボタンでも付けようかず思いたす。
  • Excelから画像を貌り付ける機胜が欲しい
    • 詊隓装眮の䞭にはExcel圢匏で出力するものもあるので、Excelの画像を取り出す→PowerPointに貌り付けるずいう機胜が欲しいそうです。
    • Excelそのたた䜿えよ

参考蚘事

python-pptx

PySimpleGUI

TypedDict

embeddable python

その他

86
80
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
86
80

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?