PyQt или PySide - какой из них использовать [закрыт]


Я начал изучать немного python и теперь хотел бы немного поиграть с gui-building. Qt кажется хорошим выбором из-за его кросс-платформенности.
Теперь, похоже, доступны две привязки: PyQt by Riverbank Computing и PySide, первоначально разработанные Nokia.
Итак, какой из них я должен выбрать? Все, что я могу найти, - это двухлетние сравнения функций, но какие различия существуют в настоящее время?
Какой из них проще в использовании, имеет больше / лучшую документацию? Являются оба еще в активном развитии?
Лицензирование не имеет большого значения для меня, так как я не собираюсь писать коммерческие приложения.

6 59

6 ответов:

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

тем не менее, я бы рекомендовал PySide для Python 2. Он имеет более разумный API, в основном он не предоставляет типы Qt, которые имеют прямой эквивалент в Python (например, QString, QList и т. д.) или которые совершенно излишни из-за динамической природы Python, как QVariant. Это позволяет избежать многих утомительных преобразований в типы Qt и из них, а также таким образом, упрощает программирование и позволяет избежать многих ошибок.

PyQt также поддерживает этот современный API и использует его по умолчанию для Python 3, но не для Python 2 для поддержания обратной совместимости.

существует также разница в лицензировании. PySide-это LGPL, а PyQt-GPL. Это может иметь значение, если вы не хотите, чтобы ваш проект с открытым исходным кодом. Хотя PyQt всегда имеет версию propriety, доступную по довольно разумной цене.

Я склонен находить документацию PySide более интуитивной. API, на мой взгляд, немного более Pythonic, и скорость исправления ошибок на данный момент довольно впечатляет.

PyQt имеет преимущество поддержки Python 3 и это еще не все. Существует гораздо больше сторонней документации / учебников для него.

недавно я портировал значительную кодовую базу (более 8000 строк кода) из PyQt в PySide.

сейчас я бы сказал, что PyQt-это гораздо более зрелый, эффективный и стабильный проект. Я ударил несколько ошибок в PySide, и подозреваю, что любой большой проект ударит проблемы. Сказав это, я сообщил об ошибке в проект, и он был исправлен и в новом выпуске в течение нескольких недель. У меня есть проблема, когда приложение занимает около 15 секунд, чтобы бросить. Я еще не потратил время, чтобы узнать почему. Однако это только вопрос времени, когда не будет никаких причин для выбора PyQt над PySide.

Если вы решили пойти с PyQt на данный момент, убедитесь, что вы используете API v2 во всем. Это лучший API, и облегчит любой будущий переход к PySide. Также, если вы делаете порт, просто следуйте инструкциям на PySide wiki. Даже для приложения 8 + kloc, состоящего из около 20 исходных файлов, это просто заняло день.

важным фактом является то, что PyQt4 имеет две версии своих API для некоторых вещей. Версия 1 элементы такие вещи, как использование QString вместо unicode и QVariant (в основном просто обертка, я считаю - я никогда не делал ничего, что использует его) вместо того, чтобы обернуть. Версия 2, которая может быть включена в Python 2 и включена в Python 3, намного лучше (хотя во многих местах все еще непифоническая - PySide тоже, но она становится заметно лучше. Есть еще некоторые оставшиеся несовместимости с ними; PyQt4 имеет QtCore.pyqt(Signal|Slot|Property), PySide имеет QtCore.(Signal|Slot|Property).

для собственного проекта я решил, что хочу поддерживать оба без изменений в коде. Я предпочитаю PySide, но на Windows я распространяю с PyQt4, так как в настоящее время он совсем немного меньше для распространения в настоящее время. Мое решение-проверить PySide, и если он есть, вставьте крюк импорта, чтобы перенаправить импорт PyQt4 в PySide, или если это не так, исправьте PyQt4, чтобы он работал так, как должен.

файлы используется:

  • pyqt4pysideimporter.py
  • zip_imp.py (для поддержки py2exe)
  • make_gui.py (мой скрипт для сборки .файлы пользовательского интерфейса .qrc файлы с помощью инструментов pyside или pyqt4 и фиксации импорта, чтобы быть последовательным; опросы для изменения файлов и перестраивает измененные-ничего высокотехнологичного, как inotify)

тогда ты просто import pyqt4pysideimporter и pyqt4pysideimporter.autoselect() (например,main.py в этом репозитории). И после этого вы можете просто import PyQt4.

в сторону: несколько дней назад в списке рассылки PySide также было указано, что они планируют полностью поддерживать Python 3 в течение следующих нескольких месяцев.

хотя они могут иметь аналогичный интерфейс для классов Qt/C++, их интерфейс для макросов Qt/C++, таких как signal/slot/property, очень отличается. Перенос одного на другой-это не простая работа. Было бы лучше принять правильное решение в самом начале.

помимо различий в грамматике / лицензии, я просто хочу указать на некоторый недостаток PyQt в привязке языка, который может быть необходим для написания проекта QML в Python. Эти различия окончательно толкают меня к PySide с PyQt.

  • qmlRegisterType

    qmlRegisterType имеет важное значение для создания привязки времени выполнения C++ с QML. В PySide, это часть PySide.Различные языки. И это очень хорошо работает с Python.

    в PyQt, qmlRegisterType не существует. И я не мог найти альтернативного подхода. Я знаю, что некоторые простые задачи можно выполнить, установив контекст QML. Но если вам действительно нужна привязка времени выполнения с qmlRegister и Q_INVOKABLE, я думаю PySide-это единственный выбор на данный момент.

  • Shiboken против глоточка

    оба могут обернуть Qt / C++ в плагин python. Для Shiboken, я чувствую, что это проще и требует меньше кодирования. Просто создайте типовую систему xml, включая название классов вы хотите экспортировать, и это все. Shiboken не требует дополнительных ручных описаний для структуры целевых классов.

    для SIP, это потребует больше дополнительного кодирования. Мы придется создать SIP-файл, который почти переопределяет все заголовок C++. Это требует не только имя класса, но и подробности о том, какие методы цель занятия. Если класс C++ находится в хорошем дизайне с использованием Pimp, и мы хотим экспортировать все методы в нем, SIP должен обеспечить способ автоматического экспорта всех методов класса, который он не может в данный момент. Это также добавит нагрузку для поддержания согласованности между SIP и Заголовки C++.

    но я должен сказать, что документация для Shiboken на Qt wiki очень плоха и вводит в заблуждение. Создание плагина Python с Shiboken на Windows не обязательно требует CMake на всех. generatorrunner тоже не требуется. Я использую только для Windows и Cmd-скрипт для вызова shiboken, и на qmake Pro для составления целевой плагин.

У меня есть 20k line Python приложение, которое я безуспешно пытался преобразовать в PySide. Преобразование легко и большинство функций работает. Есть несколько методов, которые не реализованы, потому что они "устарели", поэтому мне пришлось их исправить. Это было нормально. В Windows, используя PySide-1.1.2, оператор '= = ' не реализован для многих объектов Qt. Один из способов сказать: "если идентификатор(пункт 1) == ИД(место № 2):". Другое наблюдение заключается в том, что PySide, казалось, заметно медленнее. Я не изолировал PySide как причина медлительности, но проблема ушла, когда я вернулся к PyQt.

наконец, на данный момент комплект Android с PySide не кажется готовым к прайм-тайм.