Russian Qt Forum

Программирование => Python => Тема начата: spirits25 от Январь 22, 2013, 11:43



Название: PythonQt and Qt5
Отправлено: spirits25 от Январь 22, 2013, 11:43
Всем привет!

Есть ли новости про поддержку PythonQt (http://pythonqt.sourceforge.net/) (некоторые путают с PyQt (http://ru.wikipedia.org/wiki/PyQt), поэтому пишу заранее, что это разное ) для Qt5? Пока, насколько я знаю, поддерживается только Qt4 и внятнее этого ничего не нашёл http://sourceforge.net/projects/pythonqt/forums/forum/631392/topic/5870039

Если кто обладает инфой или сможет найти таковую, пишите сюда, буду благодарен=)


Название: Re: PythonQt and Qt5
Отправлено: sergek от Февраль 22, 2013, 09:12
... внятнее этого ничего не нашёл http://sourceforge.net/projects/pythonqt/forums/forum/631392/topic/5870039
Если кто обладает инфой или сможет найти таковую, пишите сюда, буду благодарен=)
Мелвен сделал большое дело, его порт на Qt5 работает, спасибо ему!

Я использовал PythonQt2.1_Qt5.0.0_v1.zip из состава архива по указанному им адресу (https://gigamove.rz.rwth-aachen.de/d/id/X2sXDqrfX8ESyj (https://gigamove.rz.rwth-aachen.de/d/id/X2sXDqrfX8ESyj)).
Компилировал библиотеки в Qt Creatore 2.6.2 и в Windows и Ubuntu - работает.
В python.prf не забудьте указать текущую версию Python (у меня в Windows - 2.6, в ubuntu - 2.7). В PythonQt_QtAll.pro заменил CONFIG на QT += uitools (creator потребовал). Проект tests пришлось удалить из проектной группы - не найдена qtestlib, не стал разбираться почему.

Для поддержки unicode в модулях PythonQtScriptingConsole.cpp и PythonQt.cpp надо заменить toLatin1 на toUtf8 в этих местах:
- PythonQtScriptingConsole::executeCode, 184:  p.setNewRef(PyRun_String(code.toUtf8().data(), Py_single_input, dict, dict));
- PythonQt::evalScript, 712:  p.setNewRef(PyRun_String(script.toUtf8().data(), start, dict, dict)).

Обратную совместимость (с Qt4) не проверял, вряд ли теперь вернусь.
Кажется, все. Если будут проблемы с компиляцией под виндами - могу прислать свои .prf, с которыми собираю библиотеки.


Название: Re: PythonQt and Qt5
Отправлено: yudjin87 от Апрель 04, 2013, 18:35
Привет, к сожалению, ссылка на архив уже не валидна, может кто-то скинуть на yudjin87@rambler.ruPythonQt для Qt5?
Буду очень благодарен!!


Название: Re: PythonQt and Qt5
Отправлено: sergek от Апрель 04, 2013, 19:12
Отправил почтой.


Название: Re: PythonQt and Qt5
Отправлено: sergek от Апрель 06, 2013, 12:18
Melven выложил новую ссылку: https://gigamove.rz.rwth-aachen.de/download/id/wiYwqFtrBgXKR8 (https://gigamove.rz.rwth-aachen.de/download/id/wiYwqFtrBgXKR8)


Название: Re: PythonQt and Qt5
Отправлено: fishkzn от Май 04, 2013, 11:12
ссылка снова не валидна, вышлите пожалуйста на ящик brosyskzn@gmail.com
Спасибо.


Название: Re: PythonQt and Qt5
Отправлено: sergek от Май 04, 2013, 17:08
Прошу прощения, e-mail открыл.
Сохранил архив на freesoft, там он просуществует дольше:
http://get.freesoft.ru/?id=146079 (http://get.freesoft.ru/?id=146079)


Название: Re: PythonQt and Qt5
Отправлено: fishkzn от Май 05, 2013, 17:13
Сохранил архив на freesoft, там он просуществует дольше:
http://get.freesoft.ru/?id=146079 (http://get.freesoft.ru/?id=146079)

Спасибо


Название: Re: PythonQt and Qt5
Отправлено: sergek от Сентябрь 10, 2014, 21:02
Флориан выпустил PythonQt с поддержкой QT 5 и Python 3 http://sourceforge.net/p/pythonqt/discussion/631392/thread/5f20c176/#6e17 (http://sourceforge.net/p/pythonqt/discussion/631392/thread/5f20c176/#6e17):
    Qt4 and Qt5
    Python 2 and Python 3
    Building Qt wrappers into PythonQt directly
    Building the pythonqt_generator with both Qt4 and Qt5 (without doubling the sources/CMakefiles)
    Building all examples and the unittest with Qt4/Qt5


Название: Re: PythonQt and Qt5
Отправлено: Igors от Сентябрь 11, 2014, 08:43
Спасибо (а я уж думал все - забросил)


Название: Re: PythonQt and Qt5
Отправлено: sergek от Сентябрь 11, 2014, 18:44
У меня с ходу не получилось собрать под виндами. В ubuntu еще не пробовал. Если соберете - сообщите, а то сейчас совсем нет времени.


Название: Re: PythonQt and Qt5
Отправлено: sergek от Сентябрь 19, 2014, 22:32
Чтобы собрать под виндами trunk r340 мне понадобилось изменить:

1) common.prf
CONFIG += release

2) python.prf
win32:PYTHON_VERSION=27
unix:PYTHON_VERSION=2.7

  win32:LIBS += $$(PYTHON_LIB)/libpython$${PYTHON_VERSION}$${DEBUG_EXT}.a

3) PythonQt.prf
win32::LIBS += $$PWD/../lib/libPythonQt$${DEBUG_EXT}.a

4) PythonQt_QtAll.prf
win32::LIBS += $$PWD/../lib/libPythonQt_QtAll$${DEBUG_EXT}.a

5) PythonQt_QtAll.pro
QT += uitools webkit gui svg sql network xml xmlpatterns opengl multimedia

6) src.pri
#win32:QMAKE_CXXFLAGS += /bigobj

7) PythonQtScriptingConsole::executeCode
toLatin1 заменить на toUtf8

8 ) PythonQt::evalScript
toLatin1 заменить на toUtf8

----------------------------
изменения: п.5 исправлен в trunk r363.


Название: Re: PythonQt and Qt5
Отправлено: Igors от Октябрь 08, 2014, 09:24
Пока ничего не перестраивал (по принципу "работает и слава богу"). Дальше немного не в тему но не вижу др места где спросить. Вчера юзер сообщил противный баг
Код:
for obj in sel:         # sel - tuple, любое число эл-тов, хоть 1
  print obj                  # obj живой, нормальный
  sel[0].Position.x = 9      # это работает  
  obj.Position.x = 9          #  это НЕ работает

Ошибка (вызываемая последней строкой): "Call py_set_x with wrong arguments (9,)"
Провозился весь день в отладчике, ошибка устанавливается в обоих случаях, но в первом почему-то Пытон на нее не реагирует. В конце-концов плюнул и подправил исходник. Не сталкивались?

Спасибо


Название: Re: PythonQt and Qt5
Отправлено: gil9red от Октябрь 08, 2014, 10:35
Пока ничего не перестраивал (по принципу "работает и слава богу"). Дальше немного не в тему но не вижу др места где спросить. Вчера юзер сообщил противный баг
Код:
for obj in sel:         # sel - tuple, любое число эл-тов, хоть 1
  print obj                  # obj живой, нормальный
  sel[0].Position.x = 9      # это работает  
  obj.Position.x = 9          #  это НЕ работает

Ошибка (вызываемая последней строкой): "Call py_set_x with wrong arguments (9,)"
Провозился весь день в отладчике, ошибка устанавливается в обоих случаях, но в первом почему-то Пытон на нее не реагирует. В конце-концов плюнул и подправил исходник. Не сталкивались?

Спасибо

Странно, почему он посчитал что ему кортеж с одним элементом '9' передается...


Название: Re: PythonQt and Qt5
Отправлено: sergek от Октябрь 08, 2014, 10:38
Нет. Но сейчас попробовал и столкнулся :( Но не это интересно, а вот что.
Так работает:
Код:
for obj in sel:
  sel[0].Position.x = 9
  print obj
  obj.Position.x = 9
а так - нет:
Код:
for obj in sel:
  print obj
  sel[0].Position.x = 9
  obj.Position.x = 9
Причем, ошибка вызывается не последней строкой, а  sel[0].Position.x. Попробуйте, уберите obj.Position.x = 9, ничего не изменится.
Может быть, что-то в print не так? ;)
И интересно, sel создаете средствами Питона или PythonQt?


Название: Re: PythonQt and Qt5
Отправлено: Igors от Октябрь 08, 2014, 12:14
tuple возвращается мной. Ага, оказывается любая попытка установки в цикле вызывает ошибку, но тело цикла выполняется до конца и только потом выход по ошибке. Добавил последней строкой
Код:
print "test"
И печатается "test" потом ошибка. А если печатается obj - то и ошибка сбрасывается. Ну ни хрена себе...

Я искромсал исходники так
Код
C++ (Qt)
   static const QByteArray setterString("py_set_");
   PythonQtMemberInfo setter = wrapper->classInfo()->member(setterString + attributeName);
   if (setter._type == PythonQtMemberInfo::Slot) {
     // call the setter and ignore the result value
     void* result;
     PyObject* args = PyTuple_New(1);
     Py_INCREF(value);
     PyTuple_SET_ITEM(args, 0, value);
//      PythonQtSlotFunction_CallImpl(wrapper->classInfo(), wrapper->_obj, setter._slot, args, NULL, wrapper->_wrappedPtr, &result);
     PythonQtSlotFunction_CallImpl(wrapper->classInfo(), wrapper->_obj, setter._slot, args, NULL, wrapper->_wrappedPtr);
//
     Py_DECREF(args);
     return 0;
   }
 
По смыслу так - если игнорируем result, то чего его подаем (вызывая ошибку). А шо делать?


Название: Re: PythonQt and Qt5
Отправлено: Pavel от Июнь 08, 2015, 21:13
Чтобы собрать под виндами trunk r340 мне понадобилось изменить:
А вы не пробовали новую версию PythonQt (февральскую)?

Хочу собрать PythonQt на WinXP, но меня беспокоит следующая фраза на сайте проекта:
"On Windows, the (non-source) Python Windows installer can be used. Make sure that you use the same compiler as the one that your Python distribution is built with. If you want to use another compiler, you will need to build Python yourself, using your compiler." http://pythonqt.sourceforge.net/Building.html

Сказано, будто надо собирать Python из исходников, если хочется какой-нибудь другой компилятор помимо VS2008/VS2010 (которыми собраны Python 2/3). А я компилирую Qt-программы с помощью MinGW. Но читая эту ветку я понял, что для сборки PythonQt VS не обязателен, можно обойтись MinGW. Или это не так?


Название: Re: PythonQt and Qt5
Отправлено: sergek от Июнь 09, 2015, 09:46
А вы не пробовали новую версию PythonQt (февральскую)?
Собрал r399 (http://sourceforge.net/p/pythonqt/code/HEAD/tree/ (http://sourceforge.net/p/pythonqt/code/HEAD/tree/)) - все нормально.

Сказано, будто надо собирать Python из исходников, если хочется какой-нибудь другой компилятор помимо VS2008/VS2010 (которыми собраны Python 2/3). А я компилирую Qt-программы с помощью MinGW. Но читая эту ветку я понял, что для сборки PythonQt VS не обязателен, можно обойтись MinGW. Или это не так?
Так. Я использую статическую компоновку с библиотекой импорта. Не помню, входит ли она в дистрибутив python 2.7, но ее можно самому сделать:
Цитировать
C:\windows\system32>cd C:\Python27\libs
C:\Python27\libs>pexports C:\Windows\SysWOW64\python27.dll >python27.def
C:\Python27\libs>dlltool --dllname python27.dll --def python27.def --output-lib libpython27.a
Pexports можно взять отсюда: http://sourceforge.net/projects/mingw/files/MinGW/Extension/pexports/pexports-0.46/ (http://sourceforge.net/projects/mingw/files/MinGW/Extension/pexports/pexports-0.46/)


Название: Re: PythonQt and Qt5
Отправлено: Pavel от Июнь 09, 2015, 10:33
Не помню, входит ли она в дистрибутив python 2.7, но ее можно самому сделать
В папке Python/libs файл libpython27.a имеется. Получается, даже pexports не нужен? Замечательно.

А можно ли прикрутить PythonQt к portable Питону, типа WinPython? По идее, сложностей здесь не должно возникнуть, но мало ли...


Название: Re: PythonQt and Qt5
Отправлено: sergek от Июнь 09, 2015, 11:00
А можно ли прикрутить PythonQt к portable Питону, типа WinPython? По идее, сложностей здесь не должно возникнуть, но мало ли...
А зачем? Вы будете использовать PythonQt в своей программе, которую так или иначе устанавливаете на машину. От питона требуется только python27.dll и те библиотеки py, которые вам требуются для функций, что использовали в своей программе. Так что сам интерпретатор не нужен.


Название: Re: PythonQt and Qt5
Отправлено: Pavel от Июнь 10, 2015, 15:13
А зачем?
Просто в этих сборках уже установлено всё, что нужно. Но вы правы, ведь библиотеки можно и отдельно от дистрибутива Питона распространять.

Собрал PythonQt (Qt5.4.1, Python 2.7.7, MinGW 4.9.1, WinXP32bit). Сначала пробовал установить в отдельную папку (поскольку так по умолчанию делает QtCreator), но не взлетело (ожидаемо).
Почему-то не удалось прописать INCLUDEPATH и LIBS в python.prf через переменные PYTHON_PATH и PYTHON_LIB (появлялась ошибка, что не может найти Python.h).
Пришлось их захардкодить и вместо:
win32:INCLUDEPATH += $$(PYTHON_PATH)/include
стало
INCLUDEPATH += D:/Python/include

Поскольку проект оказался замусорен промежуточными файлами компиляции, нажал Clean All. В итоге удалился libpythonqt.a (в папке PythonQt/lib), остались только dll. Пришлось собирать заново.
И ещё - можно не только tests выкинуть из проекта, но и generator (если уже есть generated_cpp_xx, где xx - версия Qt).
Ну а в целом - всё работает (наконец-то избавлюсь от PyInstaller). Странно, конечно, что автор предлагает собирать Питон из исходников, если хочется компилятор не от Microsoft.


Название: Re: PythonQt and Qt5
Отправлено: kai666_73 от Июнь 10, 2015, 17:18
Странно, конечно, что автор предлагает собирать Питон из исходников, если хочется компилятор не от Microsoft.
Ничего странного, иначе получаем смешение рантаймов.
Просто надо иметь ввиду что под win распространяется Python собранный msvc2008.
Используете другой компилер (от мелкомягких или мингв) - неообходим и Python собранный тем же компилером.

Я вот, например использую msvc2010 и вот это:
http://p-nand-q.com/python/2015.05.10-Python279-x32.7z


Название: Re: PythonQt and Qt5
Отправлено: Pavel от Июнь 10, 2015, 23:22
Просто надо иметь ввиду что под win распространяется Python собранный msvc2008.
Используете другой компилер (от мелкомягких или мингв) - неообходим и Python собранный тем же компилером.
Да, у меня Python, собранный в VS2008, отсюда и мои первоначальные сомнения. Но PythonQt я компилировал с помощью MinGW и всё отлично заработало. Собирать Python из исходников при этом не потребовалось. У sergek, как я понял, аналогичная ситуация.


Название: Re: PythonQt and Qt5
Отправлено: sergek от Июнь 11, 2015, 11:59
Почему-то не удалось прописать INCLUDEPATH и LIBS в python.prf через переменные PYTHON_PATH и PYTHON_LIB (появлялась ошибка, что не может найти Python.h).
Пришлось их захардкодить и вместо:
win32:INCLUDEPATH += $$(PYTHON_PATH)/include
стало
INCLUDEPATH += D:/Python/include
А у вас в переменных окружения они есть? Если есть, то в командной строке qmake, make должно сработать.
При сборке в Creator я сам прописываю пути в явном виде (http://www.prog.org.ru/index.php?topic=17773.msg119707#msg119707 (http://www.prog.org.ru/index.php?topic=17773.msg119707#msg119707), устаревшие рекомендации).
Если вам не нужны PythonQt_QtAll, тесты, генератор - какие проблемы, собирайте только src.pro.


Название: Re: PythonQt and Qt5
Отправлено: kai666_73 от Июнь 11, 2015, 12:26
Просто надо иметь ввиду что под win распространяется Python собранный msvc2008.
Используете другой компилер (от мелкомягких или мингв) - неообходим и Python собранный тем же компилером.
Да, у меня Python, собранный в VS2008, отсюда и мои первоначальные сомнения. Но PythonQt я компилировал с помощью MinGW и всё отлично заработало. Собирать Python из исходников при этом не потребовалось. У sergek, как я понял, аналогичная ситуация.
Вот он какой мингв всемогущий ))
Значит автор (и я отчасти) не прав: если используется компилятор от microsoft отличный от msvc2008, необходима сборка Python-а соотв. компилятором.


Название: Re: PythonQt and Qt5
Отправлено: Pavel от Июнь 11, 2015, 12:49
А у вас в переменных окружения они есть? Если есть, то в командной строке qmake, make должно сработать.
При сборке в Creator я сам прописываю пути в явном виде.
Я собираю из Creator'а, никаких дополнительных переменных не прописывал.
Возможно, там нужен один $, а не $$. Или скобочки надо убрать. Наверное, при следующей сборке опробую варианты (для Qt 5.5).

А можно ли PythonQt запустить в отдельном потоке?
И можно ли как-нибудь приделать code-autocompletion для редактирования скриптов Питона в Qt приложении?


Название: Re: PythonQt and Qt5
Отправлено: kai666_73 от Июнь 11, 2015, 13:28
А можно ли PythonQt запустить в отдельном потоке?
Што :o

И можно ли как-нибудь приделать code-autocompletion для редактирования скриптов Питона в Qt приложении?
Можно прикрутить rope или jedi... а в результате разработать собственную IDE (ага, еще одну)
Сам так вляпался ))


Название: Re: PythonQt and Qt5
Отправлено: Pavel от Июнь 11, 2015, 13:46
Што :o
Когда запускаешь длинный скрипт, то PythonQt, будучу запущенным в основном потоке (где крутится GUI), подвешивает программу, пока скрипт не выполнится.
Понятно, что из другого потока не получится легко управлять GUI-элементами, но у меня в скрипте вообще нет обращений к Qt/C++-объектам.
По идее, нет никаких препятствий для того, чтобы запустить выполнение скрипта в отдельном потоке. Вот и интересно, насколько это легко.

Цитировать
Можно прикрутить rope или jedi... а в результате разработать собственную IDE (ага, еще одну). Сам так вляпался ))
А если не пытаться создавать свою IDE, то насколько легко прикрутить jedi?
Автор PythonQt писал об этом в последнем релизе: "better support for Pylint and jedi completion library (by e.g. implementing doc strings on slots)" http://sourceforge.net/p/pythonqt/news/2015/02/pythonqt-30-released/


Название: Re: PythonQt and Qt5
Отправлено: kai666_73 от Июнь 11, 2015, 14:13
Што :o
Когда запускаешь длинный скрипт, то PythonQt, будучу запущенным в основном потоке (где крутится GUI), подвешивает программу, пока скрипт не выполнится.
Понятно, что из другого потока не получится легко управлять GUI-элементами, но у меня в скрипте вообще нет обращений к Qt/C++-объектам.
По идее, нет никаких препятствий для того, чтобы запустить выполнение скрипта в отдельном потоке. Вот и интересно, насколько это легко.

Цитировать
Можно прикрутить rope или jedi... а в результате разработать собственную IDE (ага, еще одну). Сам так вляпался ))
А если не пытаться создавать свою IDE, то насколько легко прикрутить jedi?
Автор PythonQt писал об этом в последнем релизе: "better support for Pylint and jedi completion library (by e.g. implementing doc strings on slots)" http://sourceforge.net/p/pythonqt/news/2015/02/pythonqt-30-released/
Про потоки: в принципе, я запускал скрипт выполняющий плюсовый код в отдельном потоке. Наверно, можно пойти дальше и из скрипта выполнить плюсовый код в отдельном потоке, который в свою очередь запустит на выполнение трудоемкий скрипт... но не уверен что сработает... нужно экспериментировать.
Про jedi: думается, что автор PythonQt имел ввиду автокомплит в питоновской консоли (PythonQtScriptingConsole).


Название: Re: PythonQt and Qt5
Отправлено: Pavel от Июнь 11, 2015, 14:52
Про jedi: думается, что автор PythonQt имел ввиду автокомплит в питоновской консоли (PythonQtScriptingConsole).
Вряд ли бы тогда была использована фраза better support - это подразумевает, что поддержка автокомплита была и ранее, но что-то было улучшено на уровне библиотеки.
Спасибо за наводку, кстати. PythonQtScriptingConsole класс весьма простой и его можно взять за основу для редактора скриптов. Половину там можно смело выкинуть и будет то, что нужно.
Автокомплит там достигается вызовом следующей строчки:
Код:
PythonQt::self()->introspection(_context, lookup, PythonQt::Anything);
Потом результат выполнения этой функции загружается в QCompleter (класс Qt) - и готово.


Название: Re: PythonQt and Qt5
Отправлено: kai666_73 от Июнь 11, 2015, 15:44
Про jedi: думается, что автор PythonQt имел ввиду автокомплит в питоновской консоли (PythonQtScriptingConsole).
Вряд ли бы тогда была использована фраза better support - это подразумевает, что поддержка автокомплита была и ранее, но что-то было улучшено на уровне библиотеки.
Спасибо за наводку, кстати. PythonQtScriptingConsole класс весьма простой и его можно взять за основу для редактора скриптов. Половину там можно смело выкинуть и будет то, что нужно.
Автокомплит там достигается вызовом следующей строчки:
Код:
PythonQt::self()->introspection(_context, lookup, PythonQt::Anything);
Потом результат выполнения этой функции загружается в QCompleter (класс Qt) - и готово.
Ненене. Не выйдет. В консоли каждый Enter реально выполняет питоновскую команду, в результате имеем исполняемый питоновский контекст в котором работает штатная питоновская интроспекция. Так что, использовать консоль как редактор не получится, а если и получится, то придется выпилить из нее интерактивное выполнение команд, что, в свою очередь, сделает интроспекцию бесполезной.


Название: Re: PythonQt and Qt5
Отправлено: Pavel от Июнь 11, 2015, 15:57
Ненене. Не выйдет. В консоли каждый Enter реально выполняет питоновскую команду, в результате имеем исполняемый питоновский контекст в котором работает штатная питоновская интроспекция. Так что, использовать консоль как редактор не получится, а если и получится, то придется выпилить из нее интерактивное выполнение команд, что, в свою очередь, сделает интроспекцию бесполезной.
То, что по нажатию Enter'а выполняется команда - лишь особенность любой консоли. В консоли PythonQt, кстати, можно выполнять несколько команд за раз - просто надо нажимать не Enter, а Shift+Enter. Гляньте исходники, там всё просто. Так что сделать из этой консоли простенький редактор - дело одного часа. Сюда входит интеграция с QSyntaxHighlighter :)


Название: Re: PythonQt and Qt5
Отправлено: kai666_73 от Июнь 11, 2015, 16:33
Ненене. Не выйдет. В консоли каждый Enter реально выполняет питоновскую команду, в результате имеем исполняемый питоновский контекст в котором работает штатная питоновская интроспекция. Так что, использовать консоль как редактор не получится, а если и получится, то придется выпилить из нее интерактивное выполнение команд, что, в свою очередь, сделает интроспекцию бесполезной.
То, что по нажатию Enter'а выполняется команда - лишь особенность любой консоли. В консоли PythonQt, кстати, можно выполнять несколько команд за раз - просто надо нажимать не Enter, а Shift+Enter. Гляньте исходники, там всё просто. Так что сделать из этой консоли простенький редактор - дело одного часа. Сюда входит интеграция с QSyntaxHighlighter :)
Да бога ради, делайте... но интроспекция (читай автокомплит) работать не будет.