2013-06-04 150 views
0

我有一個腳本,我想批量編輯PowerPoint文件。如果我一個一個編輯文件,它會很好。如果我批量編輯它們,它會失敗。我認爲這是因爲在下一個文件嘗試加載之前應用程序沒有關閉,但是我可能並且很可能是錯誤的。Python:在應用程序關閉時暫停for循環

代碼:

import win32com.client, sys, glob 


folder = (glob.glob('*.ppt')) 

print("="*20) 
print(folder) 
print("="*20) 

if folder: 
    for files in folder: 
     print("Current File: " + files) 
     try: 
      Application = win32com.client.Dispatch("PowerPoint.Application") 
      Application.Visible = True 
      Presentation = Application.Presentations.Open("c:/pptpy/testfolder/" + files) 
      for Slide in Presentation.Slides: 
       for Shape in Slide.Shapes: 
        try: 
         Shape.TextFrame.TextRange.Font.Name = "Arial" 
         Shape.TextFrame.TextRange.Font.Size = "14" 
         Shape.TextFrame.TextRange.Font.Color.RGB = "000000" 
        except: 
         pass 
      Presentation.Save() 
      Application.Quit() 
       #Adding a time.sleep(1) here pauses the Application.Quit() 
     except: 
      print("Error in: " + files) 
      pass 

錯誤(在不及格的例外):

Traceback (most recent call last): 
    File "C:\pptpy\testfolder\convert.py", line 19, in <module> 
    for Shape in Slide.Shapes: 
    File "C:\Python33\lib\site-packages\win32com\client\dynamic.py", line 247, in __getitem__ 
    return self._get_good_object_(self._enum_.__getitem__(index)) 
    File "C:\Python33\lib\site-packages\win32com\client\util.py", line 37, in __getitem__ 
    return self.__GetIndex(index) 
    File "C:\Python33\lib\site-packages\win32com\client\util.py", line 53, in __GetIndex 
    result = self._oleobj_.Next(1) 
pywintypes.com_error: (-2147023174, 'The RPC server is unavailable.', None, None) 

詳情:

Python3.3

Powerpoint2007

如果您需要更多詳情,我會很高興爲您提供! 謝謝!

+1

添加'time.sleep(1)'處理每個演示改變任何東西后?無論如何,*從來沒有*使用裸露的'除了:'。你應該總是指定要捕捉哪個異常。在你的例子中,你應該確定只捕獲那個'com_error'。 (如果文件夾:對於文件夾中的文件,做一個小的備註就和簡單的'對於文件夾中的文件'是一樣的。當'文件夾'爲空時,'for'永遠不會執行。) – Bakuriu

+0

感謝您提供最佳實踐建議。我對Python仍然很陌生。 我在處理的開始和結束處添加了time.sleep(1),它似乎阻止了application.quit。我嘗試添加一個10秒的睡眠,它只是等待10秒,然後關閉PPT窗口。 – Eric

+1

爲什麼您需要關閉應用程序,只需加載一個新文件,然後在每個文件處理完畢後關閉。它的速度也更快。 – joojaa

回答

1

嘗試類似的東西(建立在以前的question)。你真的應該投資時間設計你的代碼你問這樣的問題之前:

import win32com.client 
import sys # <- obsolete not used 
import os 
import glob # style guide one import per line 


Application = win32com.client.Dispatch("PowerPoint.Application") 
Application.Visible = True 

ppt_files = glob.glob('*.ppt') 

for file in ppt_files: 
    file = os.path.abspath(file) 
    Presentation = Application.Presentations.Open(file) 
    for Slide in Presentation.Slides: 
     for Shape in Slide.Shapes: 
      try: 
       Shape.TextFrame.TextRange.Font.Name = "Arial" 
       Shape.TextFrame.TextRange.Font.Size = "12" 
       Shape.TextFrame.TextRange.Font.Color.RGB = "000000" 
      except: 
       pass 
    Presentation.Save() 
    Presentation.Close() 

Application.Quit() 
+0

謝謝!你是對的,我應該在問之前花更多時間在這個問題上。我仍處於學習python的初級階段,並且發現有關PowerPoint + Python開發的文檔很困難(或者我的google-fu缺乏)。我很感謝你在這個問題上給予我的所有幫助! – Eric

+1

這與python無關,但是COM,你可以在visual basic,C,C#等中使用完全相同的代碼(或多或少)。Com只是定義了一種談判API的語言中立方式。所以程序只記錄COM接口。不幸的是,大多數時候COM接口的記錄都很糟糕,但是你可以搜索同樣的界面。從類似以下內容開始:http://www.powershow.com/view/974b7-YzE2Y/Automating_Windows_Applications_with_win32com_powerpoint_ppt_presentation或http://starship.python.net/~skippy/conferences/tools99/html/ppframe.htm – joojaa

+1

只是爲了添加您可以找到介紹對象兔子的參考:http://msdn.microsoft.com/en-us/library/ff745984%28v=office.14%29.aspx隨着所有其他對象。 – joojaa