python 3(.x) und PyQt4 ?

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
BeFu
User
Beiträge: 7
Registriert: Donnerstag 4. April 2013, 07:59
Wohnort: Europa
Kontaktdaten:

Hallo,

seit ca. 14 Tagen arbeite ich mich mit dem Buch "Objektorientierte Programmierung mit Python 3" von Michael Weigand in Python ein. Auf Rat meiner Kollegen möchte ich GUI mit PyQt4 (Q Designer) erstellen.
Leider finde ich im WEB nur Tutorials / Beispiele die PyQt4 mit Python 2.x ansprechen. So auch das Beispiel
http://openbook.galileocomputing.de/pyt ... 8c9937e6d1
In Python 3 existieren QVariant() und QString nicht mehr. So habe ich in meiner Python 3 Umgebung 'self.datensatz.append(QtCore.QVariant(lst))' durch 'self.datensatz.append(str(lst))' ersetzt. Leider bricht das so geänderte Programm ab, mit folgender Fehlermeldung: ' return QtCore.str((self.datarecords[index.row()])) AttributeError: 'module' object has no attribute 'str' '
Kann mir jemand sagen, wie ich das obige Beispiel mit Python 3(.3) und PyQt4 zum Laufen bekomme?
Außerdem bin ich für jeden Hinweis auf (auch englischsprachige) LINKS und Bücher dankbar, in denen die Arbeit mit Python 3(.3) und PyQt4 beschrieben sind. Oder ist die Nutzung von Python 3 und dem Framework 'Pyside' einfacher?
Ich freue mich auf Eure Antwort,

BeFu
Das Ziel ist der Weg
lunar

@BeFu Die Fehlermeldung passt nicht zum Quelltext. Steht in Deinem Quelltext wirklich "self.datensatz.append(QtCore.str(lst))"?!
BeFu
User
Beiträge: 7
Registriert: Donnerstag 4. April 2013, 07:59
Wohnort: Europa
Kontaktdaten:

Hallo lunar,

danke für die schnelle Antwort.

Die Fehlermeldung muss für das Buch-Beispiel richtig lauten: ' return QtCore.str((self.datensatz[index.row()]))'. Ich habe das Beispiel mit englischen Bezeichnern erstellt.
Nach Änderung von 'self.datensatz.append(QtCore.QVariant(lst))' in 'self.datarecords.append(addrdata)' sowie Einfügen von
import sip
sip.setapi('QVariant', 1) im Modul 'Hauptprogramm.py' vor ' from PyQt4 import QtGui ' funktioniert das Beispiel-Programm.
Die Einstellung der API für QVariant auf 1 habe ich durch Zufall im WEB gefunden.
Das ist eine unsaubere Lösung.
Außerdem produziert das Beispielprogramm folgende PyQt4 Bug-Meldungen:
QPainter::end: Painter ended with 3 saved states <-- währende dem Lauf
QObject::startTimer: QTimer can only be used with threads started with QThread <-- am Ende
Ich hoffe weiter auf LINKS / Bücher mit Beispielen zu Python3 mit PyQt4.
Schöne Grüße,

BeFu
Das Ziel ist der Weg
lunar

@BeFu Oh je…

Offenbar ist Dir nicht klar, was "QVariant" überhaupt ist. Ebenso scheinen Dir wesentliche Python-Grundlagen zu fehlen. Anders kann ich mir nicht erklären, wie Du überhaupt auf die Idee kommst, "QtCore.QVariant" durch "QtCore.str"(!) zu ersetzen. Du hast wohl einfach blind und ohne Verständnis dessen, was Du tust, am Quelltext herumgedoktort. Deine „Lösung“ jedenfalls entspricht dieser Vorgehensweise.

So wirst Du nicht weit kommen. Du musst schon verstehen, was Du da tust, und dazu insbesondere eben Dokumentation lesen, u.a. die zu "QVariant", zu "str", zu den allgemeinen Unterschieden zwischen Python 2 und 3, usw. Ich bin fast geneigt, Dir auch die Lektüre des offiziellen Tutorials dringend nahezulegen.
bb1898
User
Beiträge: 200
Registriert: Mittwoch 12. Juli 2006, 14:28

BeFu hat geschrieben: Ich hoffe weiter auf LINKS / Bücher mit Beispielen zu Python3 mit PyQt4.
Eine Möglichkeit, wenn auch umständlich:
Summerfield, Mark: Rapid GUI Programming with Python and Qt
Das Buch selber verwendet durchgehend Python 2.5 und PyQt 4.2/4.3, aber auf der Webseite kann man die Beispiele aktualisiert für Python 3.1 und die neuere API herunterladen. Am besten vielleicht beiderlei Quelltexte holen und vergleichen, das hilft dann beim Verständnis anderer, älterer Beispiele.
Und dann bringt PyQt natürlich reichlich Beispiele mit und die sind auf dem neuesten Stand.
BeFu
User
Beiträge: 7
Registriert: Donnerstag 4. April 2013, 07:59
Wohnort: Europa
Kontaktdaten:

Hallo lunar, hallo bb1898,

danke für Eure Hinweise. - Ja, ich habe 'blind' am Beispiel-Code QVariant ersetzt. - Das ist nicht zielführend.

@lunar: Welche Basis-Litaratur (LINKS?) empfiehlst Du zu lesen? Das von bb1898 genannte Buch halte ich für einen 'schnellen Einstieg' zunächst für zu umfangreich.

@bb1898: Kannst Du mir bitte den LINK zu den von Dir erwähnten Beispielen zu PyQt4 nennen?
Muss ich von http://www.riverbankcomputing.co.uk/sof ... t/download das Paket 'PyQt-win-gpl-4.10.zip' runter laden und installieren, damit ich die vollständige Dokumentation zu PyQt4 sowie den Source-Code der zugehörigen Beispiele durcharbeiten kann? Aktuell habe ich von dort das Binary-Package 'PyQt4-4.10-gpl-Py3.3-Qt4.8.4-x32.exe' installiert. Dort ist ja keine ''Qt documentation" enthalten. Der LINK unter ''Qt documentation" zu trolltech funktioniert (bei mir) nicht.

Ich freue mich auf Eure Antworten,

BeFu
Das Ziel ist der Weg
lunar

@BeFu Es gibt keine „Basis-Literatur“ für PyQt auf dem Niveau, welches Du benötigst. Du musst erst einmal einigermaßen Python lernen, bevor Du graphische Anwendungen mit PyQt schreiben kannst. Dazu kannst Du das offizielle Tutorial verwenden.

Im Übrigen brauchst Du nicht zu schreien. Ich denke, wir alle haben jetzt verstanden, dass Du gerne Links hättest. Es gibt halt nur keine, die Dir bei Deinem jetzigen Kenntnisstand im Bezug auf PyQt weiterhelfen könnten. Einen „Link“ zum Thema Python selbst habe ich Dir bereits genannt, auch wenn ich dessen Adresse nicht erwähnt habe. Ich traue Dir zu, dass Du die Seite des offiziellen Python-Tutorials selbst findest.
bb1898
User
Beiträge: 200
Registriert: Mittwoch 12. Juli 2006, 14:28

BeFu hat geschrieben: Muss ich von http://www.riverbankcomputing.co.uk/sof ... t/download das Paket 'PyQt-win-gpl-4.10.zip' runter laden und installieren, damit ich die vollständige Dokumentation zu PyQt4 sowie den Source-Code der zugehörigen Beispiele durcharbeiten kann? Aktuell habe ich von dort das Binary-Package 'PyQt4-4.10-gpl-Py3.3-Qt4.8.4-x32.exe' installiert. Dort ist ja keine ''Qt documentation" enthalten. Der LINK unter ''Qt documentation" zu trolltech funktioniert (bei mir) nicht.
Als erstes schau auf Deinem Rechner nach dem Verzeichnis <Dein Python-Verzeichnis>\Lib\site-packages\PyQt4\examples und nach seinem Inhalt. Unter anderem gibt's da auch ein Unterverzeichnis "tutorials", das wäre vielleicht was für den Anfang.

Die Qt-Dokumentation ist etwas anderes als die PyQt-Dokumentation. Die letztere müsstest Du haben - aber sie ist natürlich auch auf den Riverbank-Seiten. Qt ist nicht mehr Trolltech, deshalb der tote Link, sondern neuestens unter http://qt.digia.com zu finden.

Nebenbei: nach meinem besten Wissen und Gewissen gilt das, was lunar sagt, für alle GUI-Bibliotheken zu Python: Beispiele, Dokumentation, Tutorials (so weit überhaupt vorhanden) setzen Python-Kenntnisse voraus. Eine knappe Einführung gibt das Summerfield-Buch schon, aber eben zu Python 2.5, da muss man also auch manches umstricken.
BeFu
User
Beiträge: 7
Registriert: Donnerstag 4. April 2013, 07:59
Wohnort: Europa
Kontaktdaten:

Hallo bb1898, hallo lunar,

danke für Eure Hinweise.
Mit dem Python 3 Buch von Michael Weigand eigne(te) ich mir Kenntnisse von Python 3 an. Weiterführende Themen sind auch in diesem Buch mit einer GUI realisiert; dort eben mit tkinter.
Danke bb1898 für die genaue Beschreibung, wie ich mit PyQt4 gelieferte Beispiele durcharbeiten kann. :D
Mit meinen Programmierversuchen habe ich bereits einige BUG verifiziert, wie sie bei Nutzung von PyQt4 mit Python 3 im WEB beschrieben sind.
Nun arbeite ich die oben genannten Beispiele durch ...
Schöne Grüße,

BeFu
Das Ziel ist der Weg
BeFu
User
Beiträge: 7
Registriert: Donnerstag 4. April 2013, 07:59
Wohnort: Europa
Kontaktdaten:

Hallo Allerseits,

Python 3 unterstützt ja die von PyQt4 gelieferten QString und QVariable nicht mehr. QString wird durch den Python 3 Typ str (entspricht unicode) ersetzt.
In Python 3 kann einer von PyQt4 gelieferten Methode also der Pyhton 3 Typ str übergeben werden, wenn diese QString erwartet.
http://inputvalidation.blogspot.de/2010 ... tring.html zeigt für QString die Lösung für mit PyQt4 erstellten GUI und Python 3.

Aus meiner Sicht kann man den oben genannten Konstrukt auch auf QVariant anwenden, muss im Python 3 Skript dann eben den jeweils passenden Python 3 Typ schreiben.

Was meint Ihr?

Schöne Grüße,

BeFu
Das Ziel ist der Weg
lunar

@BeFu Du kannst "QVariant" einfach komplett weglassen.
Antworten