Я использую приведенный ниже код для запуска события из 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
и выдал такую ошибку.Как мне сделать, чтобы заархивировать мою цель или методы динамического добавления для всех доступных обработчиков событий?