Excel pywin32 динамический обработчик событий - PullRequest
0 голосов
/ 29 января 2019

Я использую приведенный ниже код для запуска события из Excel COM Object с pywin32

import win32com.client as win32
def record_events(key_,hash_):
    if key_ not in hash_.keys():
        hash_[key_] = 0
    else:
        hash_[key_] += 1
class ExcelEvents:
    def __init__(self):
        self.seen_events = {}
        event_methods_hash = self._dispid_to_func_
    def OnWorkbookOpen(self, *args):
        key_ = "OnWorkbookOpen" 
        record_events(key_,self.seen_events)
        print(args)
excel =  win32.gencache.EnsureDispatch('Excel.Application')
excel_events = win32.WithEvents(excel, ExcelEvents)

Доступные методы события, показанные в self._dispid_to_func_ как

{1554: 'OnWindowResize',
 1556: 'OnWindowActivate',
 1557: 'OnWindowDeactivate',
 1558: 'OnSheetSelectionChange',
 1559: 'OnSheetBeforeDoubleClick',
 1560: 'OnSheetBeforeRightClick',
 1561: 'OnSheetActivate',
 1562: 'OnSheetDeactivate',
 1563: 'OnSheetCalculate',
 1564: 'OnSheetChange',
 1565: 'OnNewWorkbook',
 1567: 'OnWorkbookOpen',
 1568: 'OnWorkbookActivate',
 1569: 'OnWorkbookDeactivate',
 1570: 'OnWorkbookBeforeClose',
 1571: 'OnWorkbookBeforeSave',
 1572: 'OnWorkbookBeforePrint',
 1573: 'OnWorkbookNewSheet',
 1574: 'OnWorkbookAddinInstall',
 1575: 'OnWorkbookAddinUninstall',
 1854: 'OnSheetFollowHyperlink',
.............

в то время как яЯ хочу создать все доступные методы одним методом вместо копирования и вставки, я пробовал общие обработчики событий Python.Однако, когда я назначаю excel_events = win32.WithEvents(excel, ExcelEvents), он получает ошибку

class ExcelEvents:
    def __init__(self):
        self.seen_events = {}
    def __getattr__(self,name):
        return handlerFunctionClosure(self,name)
    def handlerFunctionClosure(self,name):
        def handlerFunction(*args,**kwargs):
            print(name,args,kwargs)   
        return handlerFunction
c = ExcelEvents()
c.OnChange(1,4,2,c= 123) => OnChange (1, 4, 2) {'c': 123}
excel =  win32.gencache.EnsureDispatch('Excel.Application')
excel_events = win32.WithEvents(excel, ExcelEvents) => Error:TypeError: 'function' object is not iterable

Кажется, pywin32 создал новую базу классов на моем классе ExcelEvents и COM events и выдал такую ​​ошибку.Как мне сделать, чтобы заархивировать мою цель или методы динамического добавления для всех доступных обработчиков событий?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...