Russian Qt Forum
Ноябрь 25, 2024, 02:25 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: PythonQt (пр-во имен)  (Прочитано 6408 раз)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« : Октябрь 30, 2013, 22:09 »

Добрый день

Код
C++ (Qt)
// cpp
context->registerClass(&vec::staticMetaObject, "", PythonQtCreateObject<vec>);  
 
// python
pt = vec()
 
Ошибка в пытоне - не видит класса vec (хотя я могу добавить переменную такого типа из cpp приложения, но создать в пытоне нет). Так работает

Код
C++ (Qt)
// cpp
context->registerClass(&vec::staticMetaObject, "example", PythonQtCreateObject<vec>);  
 
// python
import from PythonQt.example vec
pt = vec()
 
Как мне сделать класс vec видимым из пытона не заставляя пользователя писать import?

Спасибо
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #1 : Октябрь 30, 2013, 23:02 »

Как мне сделать класс vec видимым из пытона не заставляя пользователя писать import?
Не знаю точно как там в PythonQt и проверять лень, но я бы вначале попробовал:
PythonQtObjectPtr PythonQt::importModule( const QString &name )
или выполнял бы импорт нужного модуля выполняя питоновский код через:
QVariant PythonQtObjectPtr::evalScript( const QString &script, int start = Py_file_input )

P.S. Кстати, в предыдущей теме второй вариант с исполнением питоновского импорта в нужном контексте вам уже показывали.
Записан
sergek
Гипер активный житель
*****
Offline Offline

Сообщений: 872


Мы должны приносить пользу людям.


Просмотр профиля
« Ответ #2 : Октябрь 31, 2013, 09:21 »

Как мне сделать класс vec видимым из пытона не заставляя пользователя писать import?
Сделать это самому:
Код:
// cpp
context->registerClass(&vec::staticMetaObject, "example", PythonQtCreateObject<vec>);
...
context.evalScript("from PythonQt.example import *");
Записан

Qt 5.13.0 Qt Creator 5.0.1
Win10, Ubuntu 20.04
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #3 : Октябрь 31, 2013, 09:59 »

importModule пробовал, возвращает не NULL, но результат тот же. Выполнить эту строку самому через evalScript - все норм, работает, спасибо.

Если уж разговор о пр-ве имен, то такой вопрос: вот я написал в скрипте
Код:
pt = vec()
При этом переменная pt остается живой и может использоваться в др или том же скрипте (хотя инициализации pt уже нет). Как бы мне зачистить все переменные что пользователь насоздавал при предыдущем выполнении скрипта? И как при этом кое-какие переменные оставить (пригодятся) ?

Спасибо
Записан
sergek
Гипер активный житель
*****
Offline Offline

Сообщений: 872


Мы должны приносить пользу людям.


Просмотр профиля
« Ответ #4 : Октябрь 31, 2013, 10:09 »

Как бы мне зачистить все переменные что пользователь насоздавал при предыдущем выполнении скрипта?
средствами Python:
Код:
>del pt
Записан

Qt 5.13.0 Qt Creator 5.0.1
Win10, Ubuntu 20.04
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #5 : Октябрь 31, 2013, 10:33 »

средствами Python:
Код:
>del pt
А как мне узнать что есть переменнвя pt (ведь не каждую переменная мапится мной)?
Записан
sergek
Гипер активный житель
*****
Offline Offline

Сообщений: 872


Мы должны приносить пользу людям.


Просмотр профиля
« Ответ #6 : Октябрь 31, 2013, 11:49 »

А как мне узнать что есть переменнвя pt (ведь не каждую переменная мапится мной)?
http://webonrails.ru/post/274/
http://docs.python.org/2/tutorial/
Еще можно использовать функцию расширения Python, основанную на PythonQt::getVariable, но придется ее делать методом зарегистрированного класса и вызывать ее для какого-либо глобального объекта.
К сожалению, PythonQt не предоставляет возможности регистрации обычных C-функций (а в API Python такая возможность есть).
Записан

Qt 5.13.0 Qt Creator 5.0.1
Win10, Ubuntu 20.04
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #7 : Октябрь 31, 2013, 21:40 »

Намек понял, спасибо, изучаю. Но тут др проблема - как тормознуть скрипт? Вот допустим во время передачи значения из скрипта в приложение  - отлуп (так нельзя). Как мне испустить exception (или по-другоиу) но сказать скрипту "нет, свободен" ?

Прошу прощения за сумбурность вопросов - но проект есть проект. Спасибо за понимание
Записан
sergek
Гипер активный житель
*****
Offline Offline

Сообщений: 872


Мы должны приносить пользу людям.


Просмотр профиля
« Ответ #8 : Ноябрь 01, 2013, 09:28 »

Но тут др проблема - как тормознуть скрипт? Вот допустим во время передачи значения из скрипта в приложение  - отлуп (так нельзя). Как мне испустить exception (или по-другоиу) но сказать скрипту "нет, свободен" ?
"Ну, барин, ты задачи ставишь!" (с) М.Захаров.
хз. Выполнение скрипта можно прекратить нажатием Ctrl+C. Может, добавить функцию расширения, которая будет эмулировать нажатие этих клавиш?
Записан

Qt 5.13.0 Qt Creator 5.0.1
Win10, Ubuntu 20.04
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #9 : Ноябрь 02, 2013, 12:03 »

С прерыванием все оказалось довольно просто - нужно выбросить std exception, напр
Код
C++ (Qt)
throw std::runtime_error("Stop!");
 
Вызов слота (а все происходит в слотах) обрамлен try/catch

С удалением переменных пока сделал так
Код
C++ (Qt)
bool CPyBase::AdjustDict( void )
{
PyObject * object = PythonQt::self()->getMainModule();
PyObject * dict = PyModule_GetDict(object);
if (!dict) return false;
 
if (!PyDict_Check(dict)) return false;
 
PyObject * keys = PyDict_Keys(dict);
if (!keys) return false;
 
bool doSave = mVarNames.size() == 0;
QStringList doomed;
int count = PyList_Size(keys);
for (int i = 0; i < count; ++i) {
PyObject * key = PyList_GetItem(keys, i);
QString name = PyString_AsString(key);
Py_DECREF(key);
if (doSave)
mVarNames.insert(name);
else
if (!mVarNames.contains(name) && !mCustomGlobals.contains(name))
doomed.push_back(name);
}
 
for (int i = 0; i < doomed.size(); ++i)
PythonQt::self()->removeVariable(object, doomed[i]);
 
return true;
}
 
Должен быть (по смыслу) и др вариант - при выполнении каждого скрипта заводить новый модуль пытона, а по окончании его удалять. Однако так я должен делать импорт всех необходимых модулей (math и др) всякий раз - не накладно ли? Также возможность использовать в одном скрипте переменные другого - может оказаться необходимым. Как считают более опытные товарищи?

Спасибо
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.127 секунд. Запросов: 22.