![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
Lеstat |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 76 Регистрация: 28.12.2005 Где: Москва Репутация: нет Всего: нет |
Возникла задача добавить к приложению возможность выполнять скрипты.
Для примера могу привести modo. Думаю в приложении любой контролл, виджет и т.д. отправляет команду с параметрами скриптовому движку для изменения чего-либо, получения данных и т.д. и получает результат выполнения этой команды. На данный момент прикрутил выполнение скриптов из С++ кода, но не понимаю как собрать все в кучу... Приведу очень простой пример: Вот короткая программа в которой я создаю Qt'ешное окно в С++, затем я хочу создать еще одно окно в моем же приложении, но на питоне. В коде видно, что создается новый экземпляр QApplication в питоне, и работа ведется уже с ним. Я считаю это неправильным. Я должен работать с app созданным в C++ коде. Мне нужно как-то передать указатель на экземпляр класса созданного в С++ в питон. Т.к. питон знает описание класса, например, Qwidget (т.к. подключен PyQt), то я смогу изменить заголовок окна window созданного в С++ коде... но проблема в том, что я не понимаю как передать указатель или реализовать это с помощью каких-нибудь других механизмов. Таким образом я не смогу связать С++ и питон. Просто выполняю скрипт из проги и все(
Насколько я понимаю, весь движок, приходится делать как С++'сный модуль питона, а exe'шка всего лишь выполняет запуск функции инициализации этой либы. Возможно ли вызывать методы уже созданных экземпляров классов в С++ коде из питона? Как связать экземпляры Qt'ешных классов созданных в С++ коде с питоном? Ведь и питон и С++ знают описания классов. Читал про py++, boost.python, swig. Все эти штуки требуют написания интерфейса, кроме пожалуй Py++... он вроде сам генерирует, но сделать с ним я ничего пока не смог. Допустим интерфейс создан и я могу питоновскими командами создавать/изменять/работать с объектами своей длл'ки из питона, но как взаимодействовать с объектами С++'сного кода? Объясните, пожалуйста, как вызвать метод окна window, созданного в С++ коде моего примера из питона. |
|||
|
||||
powerfox |
|
|||
![]() I wanna fork() ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3990 Регистрация: 1.10.2005 Где: Санкт-Петербург Репутация: 1 Всего: 97 |
Насколько я понял, то Kross бы вас удовлетворил на все 100. По идее, под Windows с ним не должно быть проблем, но он, если мне не изменяет память, довольно сильно завязан на библиотеки KDE. Кстати, я почем именно питон нужен? QtScript, вроде бы, довольно неплох. Это сообщение отредактировал(а) powerfox - 28.7.2009, 17:10 |
|||
|
||||
Amp |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 886 Регистрация: 17.2.2009 Репутация: нет Всего: 17 |
||||
|
||||
Lеstat |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 76 Регистрация: 28.12.2005 Где: Москва Репутация: нет Всего: нет |
Amp, powerfox, читал немного про Qt Script, но думаю нужно использовать питон.
Приложение на самом деле на wxWidgets сейчас, просто когда Qt стала LGPL стал присматриваться в сторону Qt. Просто так взять и сразу все переписать на Qt с их скриптами довольно проблематично. Вобще не хотелось бы привязываться к Qt намертво. Программа предназначена для визуализации рассчетов. Скрипты в моем случае нужны не только для создания интерфейса, возможно даже в большей степени для того чтобы рулить движком визуализации. Сейчас чтобы настраивать все это дело нужно делать очень много менюшек, чтобы все подкручивать руками. Это не удобно. Настраивать некоторые вещи в коде намертво нежелательно. Выносить в конфигии тоже, мне кажется, не лучший вариант... а вот скрипты по аналогии с modo, 3dsmax, maya, всякими CAD'ами и т.д. было бы очень хорошим решением! Пока хочу получить возможность создавать/добавлять интерфейс приложения без компиляции всего проекта. Поэтому и начал возиться с Qt и PyQt. Пытаюсь сделаю некий шаблон проскриптованного интерфейса... Про Kross слышу в первый раз, посмотрю что за штука, Спасибо! |
|||
|
||||
powerfox |
|
|||
![]() I wanna fork() ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3990 Регистрация: 1.10.2005 Где: Санкт-Петербург Репутация: 1 Всего: 97 |
Это то, что вам нужно — 100%. Вопрос лишь в том, как это всё работает в винде (должно работать, KDE под виндой вполне нормально пашет), и в том, какие зависимости вы можете себе позволить (Kross может тянуть за собой kdelibs). Возможности Kross: http://techbase.kde.org/Development/Tutorials#Kross |
|||
|
||||
Lеstat |
|
||||||||||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 76 Регистрация: 28.12.2005 Где: Москва Репутация: нет Всего: нет |
powerfox, с кроссом так и не разобрался, немного продвинулся в другом направлении)
Дублирую свой пост с другого форума... может тутор кому пригодится, да и мне кто поможет. Пытаюсь сделать поддержку приложением питоновских скриптов. На данный момент связал С++ классы с питоном использую SWIG. Думаю информация будет полезной для сообщества, напишу подробнее о том как использовал SWIG. Вот простой пример, исходники на С++: example.hpp
example.cpp
Для использования SWIG'а пишу example.i
Далее нужно сгенерировать исходники с помощью SWIG и откомпилировать их. Компилирую с помощью Visual Studio 2009 из командной строки. Для этого написал bat файл.
Теперь если выполнить
Как видим все работает! Далее мне хотелось бы использовать в питоне объкты, которые созданы и работают в С++ коде. Например, пишу такой main.cpp:
Вот теперь мне нужно передать указатель в питоновский скрипт, чтобы питон работал не с "x = example.A()" как в примере выше, а с уже созданным в C++ коде объектом cppx. Подскажите как их связать и возможно ли это вообще. Ведь питон теперь знает что такое класс A... он в модуле example. Спасибо! Это сообщение отредактировал(а) Lеstat - 11.10.2009, 14:46 |
||||||||||||
|
|||||||||||||
Lеstat |
|
||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 76 Регистрация: 28.12.2005 Где: Москва Репутация: нет Всего: нет |
Вот кое-какие продвижения, но с использованием Boost.Python
На данным момент проблема, можно сказать, решена! В коде не все понятно, но работает! Вот исходник:
На выходе получаем:
Если кто-нибудь предложит вариант с использованием SWIG о котором я писал выше буду очень благодарен! |
||||
|
|||||
![]() ![]() ![]() |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Python: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |