Мышление на высоком уровне, вот что я бы сделал:
Разработайте функцию декоратора, с помощью которой я бы украсил каждую функцию обработки событий.
Эта функция декоратора будет принимать к сведению вызываемую функцию и ее параметры (и, возможно, возвращающие значения) в единой структуре данных - заботясь, чтобы в этой структуре данных помечать экземпляры Widget и Control как особый тип объекта , Это связано с тем, что при других запусках эти виджеты не будут одинаковыми экземплярами - ах, вы даже не можете сериализовать экземпляры виджета инструментария, будь то Qt или иным образом.
Когда приходит время воспроизвести макрос, вы заполняете пробелы, заменяя объект, представляющий виджет, экземплярами фактически запущенных объектов, и просто вызываете исходные функции с оставшимися параметрами.
В наборах инструментов, которые имеют специальный параметр "события", который передается функциям обработки событий, вам также придется позаботиться о сериализации и десериализации этого события.
Надеюсь, это поможет. Я мог бы придумать какое-то доказательство концептуального кода для этого (хотя я нахожусь в настроении использовать tkinter сегодня - пришлось бы много читать, чтобы придумать пример Qt4).