PyQt: Layout in Layout produziert Fehler

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
lunar

cofi hat geschrieben:Der Designer ist für Qt geschrieben, PyQt implementiert Qt aber nicht komplett
Das ist zwar richtig ...
so hat beispielsweise das QGridLayout keine addLayout Methode. ;)
Das aber nicht. QGridLayout hat auch unter PyQt4 eine .addLayout() Methode: http://paste.pocoo.org/show/107607/
Zum uic Modul ... ich Werd damit nicht so recht warm, da man damit nur Instanzen des Widgets in der .ui erstellen kann
Das ist ebenfalls falsch, man kann sehr wohl auch die Typen laden. Doku lesen hilft. Aber was sollte man mit diesen Typen den anderes tun als Exemplare zu erzeugen? Dann kann man doch auch gleich das Exemplar laden, oder?
und da der Designer in Bezug zu PyQt nicht so recht zu gebrauchen ist, muss man dann auch wieder MonkeyPatchen
Diesen Gedankenschritt verstehe ich nicht: Wieso muss man Monkey-Patchen, um den Designer zu nutzen?
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

Bei mir hat QDesigner bisher auch fürs prototyping in Python 1A funktioniert. Ich würde nicht im Traum daran denken, eine komplexere GUI noch von Hand zusammen stricken zu wollen. (Sogar im alten Qt3 hat das Definieren von Methoden funktioniert, dann halt mit Pythoncode, aber egal.)

Dein ui-file fördert bei mir folgendes zutage:

- systemweit (Qt 4.4.3, PyQt 4.4.3) -- failure (jaja Suse mal wieder)
- lokal (Qt 4.5.0-rc1, PyQt 4.5-snapshot-20090225) -- läuft
getestet unter Opensuse 11.1 mit Python 2.6

Ursache des Problems würde ich am ehesten in einer fehlerhaften PyQt-Version suchen (wie bei mir), oder in Abhängigkeitendschungel von Qt --> PyQt <-- Python.
Da Du ja Windows benutzt, stellt sich mir die Frage, ob Du die Pakete selbst kompiliert hast, oder aber die fertigen Binärversionen verwendest. Beim letzterem mußt Du sehr genau auf die angegebenen Abhängigkeiten achten.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Ich nehm alles bzgl Designer zurück .. nachdem ich mich ein wenig in der PyQt Dokumentation ausgetobt hatte, hab nun schönen dynamischen Code, danke für den Einspruch ;)

Und das Monkey-patchen war zugegeben weit übertrieben ... es war früh am Morgen, anders kann ich mir auch nicht erklären wie ich das addLayout in der Dokumentation übersehen konnte ... wahrscheinlich, weil ich es sehen wollte, da die Fehlermeldung es ja behauptete :oops:
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

Hier mal ein diff der generierten Ui-Klassen:

Code: Alles auswählen

5,6c5,6
< # Created: Thu Mar 12 18:02:49 2009
< #      by: PyQt4 UI code generator 4.4.3
---
> # Created: Thu Mar 12 18:15:10 2009
> #      by: PyQt4 UI code generator 4.5-snapshot-20090225
128c128
<         self.formLayout.addLayout(self.horizontalLayout, 7, 1, 1, 1)
---
>         self.formLayout.setLayout(7, QtGui.QFormLayout.FieldRole, self.horizontalLayout)
150c150
<         self.formLayout.addLayout(self.horizontalLayout_2, 8, 1, 1, 1)
---
>         self.formLayout.setLayout(8, QtGui.QFormLayout.FieldRole, self.horizontalLayout_2)
Der Fehler scheint im uic-Loader 4.4.3 zu stecken, da dieser ungültigen Code generiert.
Die Riverbank-Changelogs sagen hierzu:

Code: Alles auswählen

2008/10/20 10:27:13  phil
Fixed a bug in pyuic's handling of QFormLayout when a layout is being set in a
role rather than a widget.
ergo ist das Problem zwar gefixt, womöglich aber immernoch in den älteren Binärpacketen vorhanden. Vllt. hilft Dir eine Neuinstallation des Windowspacketes von Riverbank, falls das eine neue Version ist als Deine jetzige. (Achtung wegen der Abhängigkeiten)
hurz
User
Beiträge: 12
Registriert: Mittwoch 11. März 2009, 23:47

jerch hat geschrieben:Hier mal ein diff der generierten Ui-Klassen:

Code: Alles auswählen

5,6c5,6
< # Created: Thu Mar 12 18:02:49 2009
< #      by: PyQt4 UI code generator 4.4.3
---
> # Created: Thu Mar 12 18:15:10 2009
> #      by: PyQt4 UI code generator 4.5-snapshot-20090225
128c128
<         self.formLayout.addLayout(self.horizontalLayout, 7, 1, 1, 1)
---
>         self.formLayout.setLayout(7, QtGui.QFormLayout.FieldRole, self.horizontalLayout)
150c150
<         self.formLayout.addLayout(self.horizontalLayout_2, 8, 1, 1, 1)
---
>         self.formLayout.setLayout(8, QtGui.QFormLayout.FieldRole, self.horizontalLayout_2)
Genau den Code habe ich in meiner Pythonfile von Hand ändern müssen.

Der Fehler scheint im uic-Loader 4.4.3 zu stecken, da dieser ungültigen Code generiert.
Die Riverbank-Changelogs sagen hierzu:

Code: Alles auswählen

2008/10/20 10:27:13  phil
Fixed a bug in pyuic's handling of QFormLayout when a layout is being set in a
role rather than a widget.
ergo ist das Problem zwar gefixt, womöglich aber immernoch in den älteren Binärpacketen vorhanden. Vllt. hilft Dir eine Neuinstallation des Windowspacketes von Riverbank, falls das eine neue Version ist als Deine jetzige. (Achtung wegen der Abhängigkeiten)
Das klingt einleuchtend. Mal zum Vergleich zu cofi:

Code: Alles auswählen

>>> import sys
>>> import PyQt4.QtCore
>>> sys.version
'2.5.4 (r254:67916, Dec 23 2008, 15:10:54) [MSC v.1310 32 bit (Intel)]'
>>> PyQt4.QtCore.QT_VERSION_STR
'4.4.1'
>>> PyQt4.QtCore.PYQT_VERSION_STR
'4.4.3'
Ich habe das Windows-Binary-Paket (für Python 2.5) runtergeladen, weil es mit dem source code und selbst kompilieren nicht funktioniert hat.

So wie es aussieht, sollte ich das neuere Paket runterladen - und damit auch Python auf 2.6 updaten... Muss ich dabei was Besonderes beachten? Laufen meine 2.5-Programme alle auch auf 2.6?

Und was meinst du mit dem "Abhängigkeitendschungel" von Qt und Python?
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Python hat damit nicht viel zu tun, aber das kompilierte PyQt ist eben auf eine Qt Version gelinkt. Nimmst du aber den kompletten Installer (und damit dessen Qt-Version) solltest du das Problem nicht haben.
hurz
User
Beiträge: 12
Registriert: Mittwoch 11. März 2009, 23:47

cofi hat geschrieben:Python hat damit nicht viel zu tun, aber das kompilierte PyQt ist eben auf eine Qt Version gelinkt. Nimmst du aber den kompletten Installer (und damit dessen Qt-Version) solltest du das Problem nicht haben.
Ich habe PyQt definitiv mit dem Installer installiert. Vielleicht kommt es davon, dass ich davor versucht habe, PyQt selbst zu kompilieren...

Eine Neuinstallation von PyQt mit dem Installer hilft auch nicht weiter, hab es eben ausprobiert.

:arrow: Python neu installieren?
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

Python neu installieren?
Das Problem sollte damit zwar verschwinden, ob Du Dir damit aber andere Probleme einhandelst, mußt Du selber entscheiden.

Der 2er Zweig von Python ist relativ API-stabil, die großen Änderungen kommen erst mit dem Wechsel von 2 zu 3. In Windows brauchst Du für manche Bibliotheken das pywin32 (win32all)-Package, da hatte ich von einigen Problemen mit Python 2.6 gelesen.

Auf der anderen Seite ist es halt "nur" ein Problem mit QFormLayout, welches Du vllt. schneller entweder von Hand löst oder Deinen Gui-Entwurf änderst.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Hm .. ja ich seh grad, dass es für Python 2.5 nur 4.4.3 gibt ;)
Wenn du auf 2.6 umsteigen kannst - dafür gibt es auch die richtige Version, solltest du es unbedingt tun. Du tust dir damit auch selbst einen Gefallen ;)
hurz
User
Beiträge: 12
Registriert: Mittwoch 11. März 2009, 23:47

Wenn dieser Layout-Fehler das einzige Problem ist, das bei 2.5 überbleibt, kann ich damit leben. Da wäre der Umstieg auf 2.6 ein zu großer Aufwand. Vor allem, wenn mich dort wieder neue Probleme erwarten.

Wann lohnt sich denn der Umstieg auf Version 3? Als ich vor ca. einem Monat mit Python angefangen habe, gab es zu Version 3 kaum Infos und Tutorials im Netz zu finden, und allein nach der Doku die Programme zu schreiben, fällt mir sehr schwer. Gibts denn da inzwischen mehr zu finden?

Und bietet Python 3 Vorteile gegenüber 2.5? (Performance, Bugs, ...)

Und gibt es eine PyQt-Version für Python 3? Bei den Binaries habe ich jedenfalls nichts gefunden...
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

hurz hat geschrieben:Wenn dieser Layout-Fehler das einzige Problem ist, das bei 2.5 überbleibt, kann ich damit leben. Da wäre der Umstieg auf 2.6 ein zu großer Aufwand. Vor allem, wenn mich dort wieder neue Probleme erwarten.
Da ist kein Aufwand zu erwarten.
hurz hat geschrieben:Wann lohnt sich denn der Umstieg auf Version 3? Als ich vor ca. einem Monat mit Python angefangen habe, gab es zu Version 3 kaum Infos und Tutorials im Netz zu finden, und allein nach der Doku die Programme zu schreiben, fällt mir sehr schwer. Gibts denn da inzwischen mehr zu finden?
Es gibt inzwischen ABOP für Python 3 und Dive into Python 3 wird auch irgendwann fertig sein.
hurz hat geschrieben:Und bietet Python 3 Vorteile gegenüber 2.5? (Performance, Bugs, ...)
Es ist langsamer als 2.6 und hat mehr Unicode-Bugs :P
hurz hat geschrieben:Und gibt es eine PyQt-Version für Python 3? Bei den Binaries habe ich jedenfalls nichts gefunden...
Nein, PyQt ist nicht kompatibel mit Python 3.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
hurz
User
Beiträge: 12
Registriert: Mittwoch 11. März 2009, 23:47

So, also vielen Dank nochmal für eure Hilfe! Ich habe jetzt Python auf 2.6 geupdated und der Layout-Bug ist endlich weg.

Großes Lob an das Forum! Schnelle Hilfe, nette Leute - was will man mehr? :D
Antworten