ã¯ããã«
python-pptxãšPySimpleGUIã䜿ã£ãŠPowerPointã§äœã£ããã©ãŒãããäœçœ®ã«ç»åã貌ãä»ããããŒã«ãäœã£ãã®ã§ç޹ä»ããŸãã
éçºã®çµç·¯
çŸè·ã§ã¯äž»ã«è£œåã®å®èšŒè©Šéšçãªæ¥åãæ
åœããŠããŸãã
æ¥åã®æ§è³ªäžããšããã³ã¹ãšããŠç»åãæ®åœ± â PowerPoint(å ±åçš)ã«è²Œãä»ãã ãšããäœæ¥ãå€ãçºçããŸãã
ãããã£ãäœæ¥ãå€ãããã®ã§æ¢ã«å¹çåã¯å³ãããŠããŠããææ°ãæå®ãããšäžå®ééã§ç»åã貌ãä»ããŠãããããŒã«ãã¯ååšããŸãã(DXããéšçœ²ãäœæ)
ããããå®éã«å ±åè³æãäœæããéã«æ¬²ããã®ã¯æ±ºãŸã£ããã©ãŒãããã»ç»åã®é
眮ã§ããããšãå€ãã§ãã
ãã®ãããäžå®ééã§è²Œãä»ããããšãåºæ¥ããšããŠãããããã®ãŸãŸå ±åã«äœ¿ãããšã¯ã»ãšãã©åºæ¥ããçµå±æäœæ¥ã§ç»åã®äœçœ®ã調æŽããŠãã人ãå€ãããŸãã
ããã§ãäžåžã«çžè«ããããè·å Žã®æ¹ã«èã蟌ã¿ããããããŠã
- ãã©ãŒããããèªç±ã«æå®åºæ¥ã
- PowerPointã䜿ã£ãŠ(=誰ã§ã䜿ãã)ãã©ãŒããããæå®ã§ãã
- ããã¹ããããŒã¿åã«çœ®æåºæ¥ãããããšå¬ãã
ãšããèŠçŽ ãæã€ããŒã«ãããã°è¯ãããããšããçµè«ã«è³ã£ãã®ã§äœããŸããã
ã ããã3æ¥ã§å®æãããŸããã
äœã£ããã®
PowerPointã§äœæãããã©ãŒãããã䜿çšããŠç»å貌ãä»ãã»ããã¹ã眮æãè¡ããŸãã
äž»ãªæ©èœ
- 1ããŒã¿ã«ç»åãè€æ°ååšããå Žåãæå®ããã©ãã«äœçœ®ã«ç»åã貌ãä»ããŸãã
- 1ããŒã¿ã«å¯ŸããŠè€æ°ã®ã¬ã€ã¢ãŠã(æ£é¢ãèé¢ãåŽé¢...)ã®ç»åãååšããã€ã¡ãŒãžã§ãã
- é£çªã«ãªã£ãŠããããŒã¿(1ããŒã¿:1ç»å)ã®å Žåãæå®ããäœçœ®ã«å¯ŸããŠé çªã«ç»åã貌ãä»ããŸãã
- åè§åœ¢ â ç»å ãžã®çœ®æ
- åè§åœ¢ã®é 眮 = ç»åã®é 眮
- åè§åœ¢ã®ããã¹ã = ç»åã®ã©ãã«
- ç»åã¯ããŒã¿åãšã©ãã«ãã _ ãã§åºåã
- ããã¹ãã®çœ®æ
- @1 (@ + æ°å) = ããŒã¿åãžçœ®æ
- #1 (# + æ°å) = ã©ãã«ãžçœ®æ
1ããŒã¿ã«è€æ°ç»åãååšããå Žå(ã©ãã«äœçœ®ãžã®è²Œä»ã)
1ããŒã¿ã«ç»åãè€æ°ååšããå Žåãã©ãã«ã®äœçœ®ãæå®ããããšã§ç»åãé 眮ããŸãã
å ¥åãã©ãŒããã
ã©ãã«ãæå®ããŸãã
- 1æã®ã¹ã©ã€ãã«1ã°ã«ãŒãã®å Žåã¯ãã©ãã«åãã®ã¿æå®ããŸãã
- 1æã®ã¹ã©ã€ãã«è€æ°ã°ã«ãŒããååšããå Žåã
_ã§ãé£çªããšãã©ãã«åããåºåã£ãŠæå®ããŸãã - PowerPointã§æå®ããã©ãã«åãšç»åã®ã©ãã«åã¯äžèŽãããå¿ èŠããããŸãã
äžã®äŸã§ã¯ 2ããŒã¿/1ã¹ã©ã€ã ãªã®ã§ãã1_å³ã, ã2_å³ãã®ããã« _ ã§ãé£çªããšãã©ãã«åããåºåããŸãã

â» ã©ãã«äœçœ®è²Œãä»ãã®å Žåã¯ããã¹ã眮æã䜿ãå¿ èŠãç¡ã(æ¯åã©ãã«ãåãã«ãªããã)ã®ã§ã眮æã©ãã«(#ãã)ã®é åºããã©ãã©ã§ãã
å ¥åç»å
ããã¿_å³ã®å Žåã¯ãããã¿ãorãå³ãã®ã©ã¡ãããã©ãã«ãšããŠæå®ããŸãã

åºåãããPowerPoint
1ããŒã¿ã«ç»åã1æã®å Žå(é£çªè²Œãä»ã)
é£çªã«ãªã£ãŠããããŒã¿ã®å Žåãã¹ã©ã€ããè·šãã§é çªã«ç»åã貌ãä»ããäºãã§ããŸãã
å ¥åãã©ãŒããã
åè§åœ¢ã®äžã«æ°åãæå®ããŸãã

å ¥åç»å
fruits_1ã®å Žåã¯ãfruitsããããŒã¿åãã1ããã©ãã«(é£çª)ãšããŠæ±ãããŸãã

åºåãããPowerPoint
é£çªã¯0åãã®æç¡ã«é¢ä¿ãªããæ°å€ã®å€§å°ã§å€å®ãããŸãã
å®è£
åäœç°å¢
- Windows10
- Macã§ãåäœãããšã¯æããŸãããäžéšæ©èœ(äž»ã«PySimpleGUI)ã䜿ããªãã
pathlibçã®OSã«ããæåãå€ããã©ã€ãã©ãªã«ãã圱é¿ãåºãå¯èœæ§ããããŸãã Mac䜿ã£ãŠã人ã«ãã¯ãè·äººã¯ããªããšä¿¡ããŠããã®ã§å€§äžå€«ã§ããã
- Macã§ãåäœãããšã¯æããŸãããäžéšæ©èœ(äž»ã«PySimpleGUI)ã䜿ããªãã
- 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ã§ãã£ãšèªç±ã
åºæ¬çãªäœ¿ãæ¹
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ã§ã¹ã©ã€ãã远å ããæã«äœ¿ããŸãã
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ã®åºæ¬çãªäœ¿ãæ¹ã«ã€ããŠã®è§£èª¬èšäºã¯å€æ°ããã®ã§ãããŸãèŠãããªãã£ãäœ¿ãæ¹ã ãæžããŠãããŸãã
åºæ¬çãªäœ¿ãæ¹ã®åèã«ãªããããªèšäº
- Pythonã§ãç°¡åã«GUIã¯äœãã - Qiita
- Tkinterã䜿ãã®ã§ããã°PySimpleGUIã䜿ã£ãŠã¿ãããšãã話 - Qiita
- ãã€ããŒã PySimpleGUIã玹ä»ïœeetannïœnote
èŠçŽ ã®åçãªæŽæ°(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()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)
æ®éã«èŠçŽ ãé ãããå Žåã¯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ãåãåã£ããšãã«ã€ãã³ã(ã¹ã©ã€ãéžæçšã³ã³ãããã¯ã¹ã®æŽæ°)ãå®è¡ãããŠããŸãã

ãªãã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ã®æ å ±ã管çãã
ã¹ã©ã€ããæã€ã³ã³ãã³ãã®ç®¡çã«ã€ããŠã¯ã次ã®ãããªã€ã¡ãŒãžã§å®è£ ããŸããã
Slideã¯ã©ã¹ãã³ã³ãã³ããæã¡ãã³ã³ãã³ããã°ã«ãŒãåããããŠããŠãåã³ã³ãã³ãããµã€ãºã»åº§æšã»ã©ãã«ãªã©ãæã€ããšããã€ã¡ãŒãžã§ãã
ç»åãããã¹ãããã¯ã¹ã«ã€ããŠã¯TypedDictãšããéåžžã®èŸæžãããå³å¯ã«åãå®çŸ©åºæ¥ãåãã³ãã䜿ããŸããã
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ã®ãµã€ãºã»åº§æšååŸãè¡ãã¯ã©ã¹ãäœããŸããã
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ãçæããããšã§ãåºåçšã®æ
å ±ãã²ãšãŸãšãã«ãã圢ã«ããŸããã
ããã®å®è£ ã¯ããå°ã綺éºã«åºæ¥ãæ°ãããŸãã
ããã¹ãã®çœ®æ
# çç¥...
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æžã蟌ã¿
æžã蟌ã¿ã¯æ¬¡ã®ãããªæµãã§å®è£ ããŸããã
- èšå®çšã®PowerPointãè€è£œ
- è€è£œããPowerPointã«ã¢ã¯ã»ã¹
- ããŒã¹ãšãªãã¹ã©ã€ãã®çœ®æå¯Ÿè±¡å³åœ¢ã»ããã¹ãããã¯ã¹ãåé€
- ããŒã¹ãšãªãã¹ã©ã€ããå¿ èŠãªææ°è€è£œ
- åã¹ã©ã€ãã«ç»åã»ããã¹ãããã¯ã¹ãåºå
- ããŒã¹ãšãªãã¹ã©ã€ããåé€
- è€è£œããPowerPointãä¿å
äœæ
ãããªé¢åãªããšãããããšãããšãã衚ãäœã£ãŠãã®äžã«ç»åãå
¥ãããããšãå€ãé¢ä¿ã§ã眮æå¯Ÿè±¡ä»¥å€ã®å³åœ¢ã¯æ®ããŠããããããã§ãã
äœæ
ã衚ã®äžã«ç»åãé
眮ããããšãå€ãã®ã§ããèŠæ ããè¯ãããã§ããããã
GUI
GUIã¯æ¬¡ã®ããã«ãªããŸããã
ã€ãã³ãã®ç®¡çã«ã¯ãã³ãã©ãŒã䜿ããŸããã
ãšãã£ãŠãã€ãã³ããããŒã«ã颿°ãå€ã«æã€èŸæžãå®çŸ©ããã ãã§ãã
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)
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
- python-pptx â python-pptx 0.6.21 documentation
- ãPythonÃPowerPointãpython-pptxã®å°å ¥~ãã¡ã€ã«ã»ã¹ã©ã€ãäœææ¹æ³ã培åºè§£èª¬
- Python-pptx: copy slide - Stack Overflow
- Is there a way to delete a shape with python-pptx - Stack Overflow
PySimpleGUI
- Call reference - PySimpleGUI
- Cookbook - PySimpleGUI
-
PySimpleGUIã§GUIã¢ããªãäœã£ãŠã¿ã ~ãã®1~
- ãã³ãã©ãŒã§ã€ãã³ã管çãããã¹ã¿ã€ã«ãèŸæžã«åãåºããªã©ã®èãæ¹ãåèã«ãããŠããã ããŸããã
TypedDict
- [Python3.8ïœ]ãã«ãã€ã³ã®TypedDictã«ã€ããŠè©³ãã調ã¹ãŠã¿ãïŒPEP589ïŒ - Qiita
-
[Python]Pylanceã®VS Codeæ¡åŒµæ©èœããã£ãã䜿ã£ãŠã¿ãã - Qiita
- VSCodeã®ããã©ã«ãã ãšåãã§ãã¯ãå¹ããªãããšãããã®ã§ãã®èšäºãåèã«èšå®ã倿ŽããŸããã
embeddable python
- è¶ è»œéãè¶ é«éãªé åžçšPythonãembeddable pythonã - Qiita
- 4. Windows ã§ Python ã䜿ã â Python 3.10.4 ããã¥ã¡ã³ã
-
Python embeddable zip: install Tkinter - Stack Overflow
- tkinterã®å°å ¥
ãã®ä»
-
補é çŸå Žåãã®èªååããŒã«ãPythonã§äœãæã«çæããããš - Qiita
- ããŒã«ã®äœæã»å±éã«åœãã£ãŠã®çæç¹ãåèã«ããŸããã補é çŸå Žã§ã¯ãããŸããããçŸå Žã®ã¬ãã«æã¯äŒŒããããªãã®ãªã®ã§ã
- åäœãµã³ãã«ã«äœ¿çšããç»å











