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.
68
Antworten:
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.
quelle
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.
quelle
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.
quelle
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
QString
anstelle vonunicode
undQVariant
(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 hatQtCore.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:
Dann Sie gerade
import pyqt4pysideimporter
undpyqt4pysideimporter.autoselect()
(wiemain.py
in diesem Repository). Und danach kannst du einfachimport 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.
quelle
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.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.
quelle
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.
quelle