Реализация макрос записи для Python GUI?

Я задаюсь вопросом, как реализовать реализацию рекордера макросов для Python GUI (вероятно, PyQt, но в идеале не зависит). Нечто подобное в Excel, но вместо того, чтобы получать макросы VB, он будет создавать код Python. Ранее я сделал что-то для Tkinter, где все обратные вызовы проходят через один класс, который регистрирует действия. К сожалению, мой класс, ведущий регистрацию, был немного уродливым, и я ищу более хороший. Хотя это действительно отличало графический интерфейс от остального кода, оно кажется необычным с точки зрения обычного подключения сигналов / слотов. Есть ли способ лучше?

Предполагается, что пользователь может пройти процедуру анализа данных в графическом интерфейсе, наблюдая за эффектом своих решений. Позже записанная процедура может быть применена к другим данным с незначительными изменениями и без необходимости запуска графического интерфейса.

3 ответа

Вы можете применить шаблон проектирования команд: когда ваш пользователь выполняет действие, сгенерируйте команду, которая представляет требуемые изменения. Затем вы реализуете какой-то конвейер команд, который выполняет сами команды, скорее всего, просто вызывая методы, которые у вас уже есть. После того, как команды выполнены, вы можете их сериализовать или записать их так, как вы хотите, и загрузить серию команд, когда вам потребуется повторно выполнить процедуру.

Думая на высоком уровне, это то, что я бы сделал:

Разработайте функцию декоратора, с помощью которой я бы украсил каждую функцию обработки событий.

Эти функции декоратора будут принимать к сведению вызываемую функцию и ее параметры (и, возможно, возвращающие значения) в единой структуре данных - заботясь об этой структуре данных, чтобы пометить экземпляры Widget и Control как особый тип объекта. Это связано с тем, что в других запусках эти виджеты не будут одинаковыми экземплярами - ах, вы даже не можете сериализовать экземпляры виджета инструментария, будь то Qt или нет.

Когда наступает момент для воспроизведения макроса, вы заполняете пробелы, заменяя объект, представляющий виджет, экземплярами фактически запущенных объектов, и просто вызываете исходные функции с оставшимися параметрами.

В наборах инструментов, имеющих специальный параметр "событие", который передается функциям обработки событий, вам также придется позаботиться о сериализации и десериализации этого события.

Я надеюсь, что это может помочь. Я мог бы придумать какое-то доказательство концептуального кода для этого (хотя у меня сегодня настроение использовать tkinter - пришлось бы много читать, чтобы придумать пример Qt4).

Пример того, что вы ищете, находится в Mayavi2. Для ваших целей, функциональность mayavi2 "запись скрипта" будет генерировать скрипт Python, который затем может быть тривиально изменен для других случаев. Я слышал, что это работает довольно хорошо.

Другие вопросы по тегам