PyQt oder PySide - welches verwendet werden soll [geschlossen]

68

Ich habe angefangen, ein bisschen Python zu lernen und möchte jetzt ein bisschen mit Gui-Building herumspielen. Qt scheint aufgrund seiner plattformübergreifenden Ausrichtung eine gute Wahl zu sein.
Jetzt scheinen zwei Bindungen verfügbar zu sein: PyQt von Riverbank Computing und PySide, ursprünglich von Nokia entwickelt.
Also welches soll ich wählen? Ich kann nur zwei Jahre alte Funktionsvergleiche finden, aber welche Unterschiede gibt es heutzutage?
Welches ist einfacher zu bedienen, hat mehr / bessere Dokumentation? Sind beide noch in aktiver Entwicklung?
Die Lizenzierung ist mir kein großes Anliegen, da ich nicht beabsichtige, kommerzielle Anwendungen zu schreiben.

Shutefan
quelle
Ich benutze PyQt schon eine Weile und für mich schien es absolut in Ordnung zu sein. Sie sollten überlegen, was Sie damit machen werden. Wenn Sie nur von "Fenstern" und "Schaltflächen" sprechen, ist PyQt meiner Meinung nach eine absolut gute Wahl.
Andrey Agibalov
Es mag nicht viel sein - aber dieser Vergleich scheint ziemlich aktuell zu sein: developer.qt.nokia.com/wiki/Differences_Between_PySide_and_PyQt Abgesehen davon besteht der größte Unterschied wahrscheinlich darin, dass pyside noch keine Python 3-Unterstützung hat, während pyqt dies tut es schon.
BergmannF
3
Sie müssen auch berücksichtigen, dass PyQt nur mit einer GPL-Lizenz geliefert wird, pyside jedoch freizügiger ist und unter LGPL veröffentlicht wird.
Anoop
4
PySide unterstützt Python 3 seit 1.0.8
troy.unrau

Antworten:

33

Beide Toolkits werden aktiv gewartet und sind in Funktion und Qualität mittlerweile mehr oder weniger gleich. Es gibt nur wenige, eher unwichtige Unterschiede.

Trotzdem würde ich PySide für Python 2 empfehlen. Es hat eine vernünftigere API, hauptsächlich werden keine Qt-Typen verfügbar gemacht, die in Python eine direkte Entsprechung haben (z. B. QString, QList usw.) oder die aufgrund von völlig überflüssig sind Pythons dynamische Natur wie QVariant. Dies vermeidet viele mühsame Konvertierungen von und zu Qt-Typen, vereinfacht somit die Programmierung und vermeidet viele Fehler.

PyQt unterstützt auch diese moderne API und verwendet sie standardmäßig für Python 3, jedoch nicht für Python 2, um die Abwärtskompatibilität aufrechtzuerhalten.

Mondhorn
quelle
Oh mein Gott, das macht es noch schwieriger. Da ich erst vor kurzem angefangen habe, Python zu lernen, habe ich mich für Python 3 entschieden (wie auf python.org empfohlen). Nach einem kurzen Vergleich scheint Nokia eine bessere Dokumentation (wie von @ Vort3x bereitgestellt) als Riverbank zu
bieten
2
@shutefan: Ich für meinen Teil verwende die Dokumentation für die Bindungen nur selten, sowohl mit PyQt als auch mit PySide. Im Allgemeinen lese ich die herausragende C ++ - Dokumentation für Qt (sie enthält auch recht gute Beispiele und längere Artikel zu Qt-Frameworks und -Techniken) und verwende die Bindungsdokumentation nur, um Python-spezifische Dinge (wie die Signal-Slot-API) oder Signaturen von nachzuschlagen eingewickelte Objekte.
Mondhorn
2
Es ist nicht wahr, dass Sie PyQts API v1 unter Python 2 verwenden müssen. Sie können es einfach mit sip.setapi auf v2 umschalten. riverbankcomputing.co.uk/static/Docs/PyQt4/html/...
aukaost
@something: Ich habe nichts anderes gesagt, ich habe nur gesagt, dass API v2 für Python 2 standardmäßig nicht aktiviert ist . Natürlich kann es immer explizit aktiviert werden (zugegeben, ich hätte das sagen sollen). Dies kann jedoch zu Problemen führen, wenn für eine von Ihnen verwendete Bibliothek weiterhin API v1 erforderlich ist, da API v1 und v2 nicht zusammen im selben Interpreter verwendet werden können.
Mondhorn
1
@lynaryorn Fair genug, aber es sollte bearbeitet werden, da es ein bisschen kryptisch ist (explizit ist besser als implizit) und der zweite Absatz irreführend ist. Zwei Personen waren durch die Antwort genug verwirrt, um hier in den Kommentaren etwas zu sagen, nachdem sie gelesen haben, was Sie geschrieben haben. Wahrscheinlich sollte hinzugefügt werden, wie dies in PyQt / Python 2 gemacht wird. Natürlich würde dies den Grund für die Empfehlung von PySide gegenüber PyQt in erster Linie leicht untergraben (was ich als irreführend empfand). Antwort hängt einfach nicht so gut zusammen. Außerdem ist es einfach nicht mehr wahr, dass PySide in der Wartung in der Nähe von PyQt ist: v 4 v 5 usw.
10.
25

Es gibt auch den Lizenzunterschied. PySide ist LGPL, während PyQt GPL ist. Dies kann einen Unterschied machen, wenn Sie Ihr Projekt nicht zu Open Source machen möchten. Obwohl PyQt immer die richtige Version zu einem ziemlich vernünftigen Preis zur Verfügung hat.

Ich finde die PySide-Dokumentation eher intuitiv. Die API ist meiner Meinung nach etwas pythonischer und die Rate der Fehlerkorrekturen ist im Moment ziemlich beeindruckend.

PyQt bietet den Vorteil der Python 3-Unterstützung und der Incumbency. Es gibt viel mehr Dokumentationen / Tutorials von Drittanbietern.

Gerald
quelle
11
Sie nennen £ 350 pro Entwickler ziemlich vernünftig, oder? Ich nicht, wenn es ein Projekt gibt, das an manchen Stellen genauso gut und besser ist und noch viel schneller besser wird und kostenlos verwendet werden kann. Sie stoßen immer wieder auf Fehler, die jedoch schnell behoben werden.
Chris Morgan
2
@ Chris Morgan: Sie würden also sagen, dass die Entwicklung für PySide aktiver ist? Kennt jemand übrigens, wer hinter PySide steht? Ist es noch Nokia? In diesem Fall wäre ich mir über die Zukunft des Projekts nicht sicher ...
Shutefan
1
@shutefan: Zur Zeit scheint mir PySide aktiver zu sein; Es wird weiter daran gearbeitet, besser zu werden, während PyQt4 hauptsächlich mit dem Qt-Fortschritt Schritt hält. Nokia unterstützt OpenBossa in irgendeiner Weise (ich kenne die genaue Anordnung nicht) und sie sind für das PySide-Projekt verantwortlich. Ich habe mich gefragt, was mit all dem Qt-Zeug passieren wird - Qt, PyQt4, PySide und so weiter. - Wenn Nokia untergeht (gekauft wird), wird es wahrscheinlich ziemlich bald passieren. Und meine Antwort lautet: Ich weiß es nicht; aber es scheint mir unwahrscheinlich, dass eines dieser Dinge von ihren Gemeinschaften nicht zum Zusammenbruch zugelassen wird.
Chris Morgan
1
@Gerald: Stimmt, Nokia stellt die Finanzierung ein, aber die Diskussionen über die Zukunft des Projekts scheinen mir in die richtige Richtung zu gehen, und ich vermute, dass es von einem anderen Unternehmen gesponsert wird. Was ist das Problem mit LGPL? Ich sage, dass ich 350 GBP für eine PyQt4-Lizenz nicht für angemessen halte, da ich PySide generell für besser halte .
Chris Morgan
4
"Dies könnte einen Unterschied machen, wenn Sie Ihr Projekt nicht zu Open Source machen möchten." Eigentlich ist das falsch, es macht einen Unterschied, ob Ihr Projekt keine GPL ist. Ich arbeite an einem Open-Source-Projekt. BSD-lizenziert, und PyQT ist für diese Szenarien zu restriktiv, und 350 GBP sind für ein Open-Source-Projekt kein Problem.
WhyNotHugo
17

Ich habe kürzlich eine bedeutende Codebasis (über 8.000 Codezeilen) von PyQt auf PySide portiert.

Im Moment würde ich sagen, dass PyQt ein viel ausgereifteres, performanteres und stabileres Projekt ist. Ich habe eine Reihe von Fehlern in PySide festgestellt und vermute, dass jedes große Projekt Probleme verursachen wird. Trotzdem habe ich dem Projekt einen Fehler gemeldet, der innerhalb weniger Wochen behoben und in einer neuen Version veröffentlicht wurde. Ich habe auch ein Problem, bei dem das Beenden der App etwa 15 Sekunden dauert. Ich habe noch keine Zeit damit verbracht herauszufinden, warum. Es ist jedoch nur eine Frage der Zeit, bis es keine Gründe mehr gibt, sich für PyQt anstelle von PySide zu entscheiden.

Wenn Sie sich vorerst für PyQt entscheiden, stellen Sie sicher, dass Sie API v2 verwenden. Es ist eine bessere API und erleichtert den zukünftigen Übergang zu PySide. Befolgen Sie auch beim Portieren einfach die Richtlinien im PySide-Wiki. Selbst für eine 8+ Kloc-App, die aus etwa 20 Quelldateien besteht, dauerte es nur einen Nachmittag.

Simon Hibbs
quelle
2
Seit ich das geschrieben habe, ist das PySide-Projekt sterbend geworden, aber es ist immer noch eine anständige Codebasis. Meine App läuft immer noch einwandfrei und die Fehler, die ich getroffen habe, wurden entweder behoben oder trivial umgangen. Ich werde vielleicht irgendwann zu PyQt zurückkehren, aber ich fühle keine Dringlichkeit dabei.
Simon Hibbs
1
PySide ist nicht tot ....
Eric
1
Es sieht so aus, als gäbe es einige gute Neuigkeiten zur Unterstützung von PySide und Qt5 : wiki.qt.io/PySide_Roadmap , lists.qt-project.org/pipermail/pyside/2015-April/002285.html und lists.qt-project.org/ pipermail / pyside / 2015-Juni / 002298.html
gmas80
10

Eine wichtige Tatsache ist, dass PyQt4 für einige Dinge zwei Versionen seiner APIs hat. Bei Elementen der Version 1 handelt es sich beispielsweise um die Verwendung QStringanstelle von unicodeund QVariant(im Grunde genommen nur um einen Wrapper, glaube ich - ich habe noch nie etwas getan, das sie verwendet) anstelle des Wraps. Version 2, die in Python 2 aktiviert werden kann und in Python 3 aktiviert ist, ist viel besser (obwohl an vielen Stellen immer noch unpythonisch - PySide ist es auch, aber es wird deutlich besser. Es gibt noch einige Inkompatibilitäten mit ihnen; PyQt4 hat QtCore.pyqt(Signal|Slot|Property), PySide hatQtCore.(Signal|Slot|Property) .

Für ein eigenes Projekt habe ich beschlossen, beide ohne Änderungen am Code zu unterstützen. Ich bevorzuge PySide, aber unter Windows verteile ich mit PyQt4, da es derzeit für die Verteilung etwas kleiner ist. Meine Lösung besteht darin, nach PySide zu suchen und einen Import-Hook einzufügen, um PyQt4-Importe nach PySide umzuleiten. Wenn dies nicht der Fall ist, reparieren Sie PyQt4 so, dass es ordnungsgemäß funktioniert.

Die verwendeten Dateien:

  • pyqt4pysideimporter.py
  • zip_imp.py (für py2exe-Unterstützung)
  • make_gui.py (mein Skript zum Erstellen von .ui-Dateien und .qrc-Dateien mit pyside- oder pyqt4-Tools und zum Korrigieren der Importe als konsistent; Abfragen nach Dateiänderungen und Neuerstellen der geänderten - nichts Hightech wie inotify)

Dann Sie gerade import pyqt4pysideimporterund pyqt4pysideimporter.autoselect()(wie main.pyin diesem Repository). Und danach kannst du einfach import PyQt4.

Nebenbei: Vor einigen Tagen wurde auf der PySide-Mailingliste auch angegeben, dass Python 3 in den nächsten Monaten vollständig unterstützt werden soll.

Chris Morgan
quelle
Sie sagen, es ist kleiner unter Windows; um wie viel und was ist mit anderen Plattformen?
Shutefan
@shutefan: Als alles optimal funktioniert hat (siehe make_py2exe.py- ein optimaler Satz von Flags für py2exe plus Komprimierung mit UPX), war der Unterschied meiner Meinung nach etwa 8 MB statt 9-10 MB (dh einschließlich der vollständigen Python-Laufzeit und all meiner Inhalte) auch), aber ich kann mich nicht genau an die Zahlen erinnern. Unter Linux sind die .so-Dateien, die die Python-Module darstellen, im Durchschnitt etwa doppelt so groß wie die PyQt4-Module.
Chris Morgan
10

Obwohl sie möglicherweise eine ähnliche Schnittstelle für Qt / C ++ - Klassen haben, sind ihre Schnittstellen für Qt / C ++ - Makros wie signal / slot / property sehr unterschiedlich. Das Portieren untereinander ist keine leichte Aufgabe. Es wäre besser, gleich zu Beginn die richtige Entscheidung zu treffen.

Abgesehen von den Grammatik- / Lizenzunterschieden möchte ich nur auf einen Mangel an PyQt bei der Sprachbindung hinweisen, der für das Schreiben eines QML-Projekts in Python von entscheidender Bedeutung sein kann. Diese Unterschiede bringen mich schließlich von PyQt zu PySide.

  • qmlRegisterType

    qmlRegisterType ist wichtig, um eine Laufzeit-C ++ - Bindung mit QML zu erstellen. In PySide ist es Teil von PySide.QtDeclarative. Und das funktioniert ziemlich gut mit Python.

    In PyQt existiert qmlRegisterType nicht. Und ich konnte keinen alternativen Ansatz finden. Ich weiß, dass eine einfache Aufgabe durch Festlegen des QML-Kontexts erledigt werden kann. Aber wenn Sie wirklich eine Laufzeitbindung mit qmlRegister und Q_INVOKABLE benötigen, ist PySide momentan die einzige Wahl.

  • Shiboken VS SIP

    Beide können Qt / C ++ in das Python-Plugin einbinden. Für Shiboken ist es meiner Meinung nach einfacher und erfordert weniger Codierung. Erstellen Sie einfach eine Typsystem-XML mit dem Namen der Klassen Sie einfach Sie exportieren möchten, und das ist alles. Shiboken erfordert keine zusätzlichen manuellen Beschreibungen für die Struktur der Zielklassen.

    Für SIP wäre mehr zusätzliche Codierung erforderlich. Wir müssen eine SIP-Datei erstellen, die fast alles im C ++ - Header neu implementiert. Es erfordert nicht nur den NAMEN der Klasse , sondern auch die DETAILS, über welche Methoden die Zielklassen verfügen. Wenn die C ++ - Klasse mit Pimp in gutem Design ist und wir alle darin enthaltenen Methoden exportieren möchten, sollte SIP eine Möglichkeit bieten, alle Klassenmethoden automatisch zu exportieren, was derzeit nicht möglich ist. Dies würde auch die Aufrechterhaltung der Konsistenz zwischen dem SIP- und dem C ++ - Header zusätzlich belasten.

    Aber ich muss sagen, dass die Dokumentation für Shiboken im Qt-Wiki sehr schlecht und irreführend ist. Das Erstellen eines Python-Plugins mit Shiboken unter Windows erfordert nicht unbedingt CMake . Generatorrunner ist ebenfalls nicht erforderlich. Ich verwende nur ein Windows-Cmd-Skript zum Aufrufen von Shiboken und ein qmake Pro zum Kompilieren des Ziel-Plugins.

jichi
quelle
Weiß jemand, wie der aktuelle Status ist? Hat PyQT jetzt diese Laufzeitbindung? Können Sie PyQT mit QML verwenden, ohne Hindernisse, die es mit PySide nicht geben würde?
Dan Ross
Dies ist nicht mehr der Fall; PyQt unterstützt jetzt qmlRegisterType und QML-Bindung in PyQt5
jpyams
4

Ich habe eine Python-App mit 20.000 Zeilen, die ich erfolglos in PySide konvertieren wollte. Die Konvertierung ist einfach und die meisten Funktionen funktionieren. Es gibt mehrere Methoden, die nicht implementiert sind, weil sie "veraltet" sind, daher musste ich diese beheben. Das war in Ordnung Unter Windows unter Verwendung von PySide-1.1.2 ist der Operator '==' für viele Qt-Objekte nicht implementiert. Eine Problemumgehung besteht darin, zu sagen: "if id (item1) == id (item2):". Die andere Beobachtung ist, dass PySide merklich langsamer schien. Ich habe PySide nicht als Ursache für die Langsamkeit isoliert, aber das Problem verschwand, als ich zu PyQt zurückkehrte.

Schließlich scheint das Android-Kit mit PySide derzeit nicht für die Hauptsendezeit bereit zu sein.

SoloPilot
quelle
Es scheint, als würde man sich für .NET (PyQT) oder Delphi (PySide) entscheiden. Man kann also mit Sicherheit sagen, dass PyQt PySide immer einen Schritt voraus sein wird.
swdev