Я встраиваю Python в QT-приложение с графическим интерфейсом. Я назначил сигнал одной из моих кнопок в своем UI-файле, и при нажатии на него я запускаю скрипт.
Это работает при использовании подхода из
http://docs.python.org/py3k/extending/embedding.html
Я также добавил некоторые функции во встроенный модуль, как показано в разделе 5.4 на этой странице. Я хочу иметь возможность добавить некоторые задержки в сценарии Python. Как я могу сделать это без использования сна, так как сон остановит все приложение? Я полагаю, вы бы сделали это с QTimer, который через некоторое время будит скрипт python, но я не могу понять, как это сделать.
Я считаю, что я довольно близок к решению, так что я не хочу добавлять потоки, если это возможно, или даже другую среду, такую как PythonQT или Boost.
Здесь соответствующий фрагмент:
static PyObject* openDoor(PyObject *self, PyObject *args)
{
int value1 = 0;
if (!PyArg_ParseTuple(args, "l", &value1))
return Py_BuildValue("i", -1);
opendoor(value1)
return PyLong_FromLong(value1);
}
static PyObject* mysleep(PyObject *self, PyObject *args)
{
int value1 = 0;
if (!PyArg_ParseTuple(args, "l", &value1))
return Py_BuildValue("i", -1);
// this does not work !!!
// QTimer slideShowtimer = new QTimer(this);
// connect(slideShowtimer, SIGNAL(timeout()), this, SLOT(slideShowHelper()));
// slideShowtimer->start(5000);
return PyLong_FromLong(value1);
}
static PyMethodDef EmbMethods[] = {
{"openDoor", openDoor, METH_VARARGS, "."},
{"closeDoor", closeDoor, METH_VARARGS, "."},
{"sleep", mysleep, METH_VARARGS, "Sleep."},
{NULL, NULL, 0, NULL}
};
static PyModuleDef EmbModule = {
PyModuleDef_HEAD_INIT, "obu", NULL, -1, EmbMethods,
NULL, NULL, NULL, NULL
};
static PyObject*
PyInit_emb(void)
{
return PyModule_Create(&EmbModule);
}
// taken from python docs
void MainWindow::on_ScriptButton_clicked()
{
PyObject *pName, *pModule, *pFunc;
PyObject *pArgs, *pValue;
int i;
PyImport_AppendInittab("emb", &PyInit_emb);
Py_Initialize();
pName = PyUnicode_FromString("multiply");
pModule = PyImport_Import(pName);
Py_DECREF(pName);
if (pModule != NULL) {
pFunc = PyObject_GetAttrString(pModule, "run");
if (pFunc && PyCallable_Check(pFunc)) {
pArgs = PyTuple_New(1);
for (i = 0; i < 1; ++i) {
pValue = PyLong_FromVoidPtr(this);
if (!pValue) {
Py_DECREF(pArgs);
Py_DECREF(pModule);
fprintf(stderr, "Cannot convert argument\n");
}
PyTuple_SetItem(pArgs, i, pValue);
}
pValue = PyObject_CallObject(pFunc, pArgs);
Py_DECREF(pArgs);
if (pValue != NULL) {
printf("Result of call: %ld\n", PyLong_AsLong(pValue));
Py_DECREF(pValue);
}
else {
Py_DECREF(pFunc);
Py_DECREF(pModule);
PyErr_Print();
fprintf(stderr,"Call failed\n");
}
}
else {
if (PyErr_Occurred())
PyErr_Print();
fprintf(stderr, "Cannot find function \n");
}
Py_XDECREF(pFunc);
Py_DECREF(pModule);
;
}
else {
PyErr_Print();
fprintf(stderr, "002 Failed to load \n");
}
Py_Finalize();
}