PYQT4: Bilder zu Resourcen hinzufügen

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
Benutzeravatar
microkernel
User
Beiträge: 271
Registriert: Mittwoch 10. Juni 2009, 17:27
Wohnort: Frankfurt
Kontaktdaten:

Hallo,
ich arbeite zurzeit an einem GUI-Python programm welches mit PYQT4 gemacht wurde. Jetzt habe ich in diesem Programm ein paar Bildern eingefügt und nun auch schon ein .exe draus gemacht. Nun ist mein Problem das es mich sehr nervt das die ganzen Bildern da frei rumliegen und jeder auf sie zugreifen/bearbeiten kann. Kann mir jmd. erklären wie ich all diese Bildern in eine Resource (z.B. eine .dll Datei) packen kann und dann in meinen Programm auf sie zugreifen kann?
Würde mich sehr um eine nützliche Antwort freuen.

LG
microkernel
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

microkernel hat geschrieben:Nun ist mein Problem das es mich sehr nervt das die ganzen Bildern da frei rumliegen und jeder auf sie zugreifen/bearbeiten kann.
Warum ist das ein Problem? Gehörst du der "Anti-OpenSource-Initiative" an?
lunar

@derdon
Dieser Kommentar war ein bisschen überflüssig ... einfacheres Deployment wäre beispielsweise ein Grund, Bilder in die Exe-Datei zu integrieren.

PyQt4 bietet eine Resourcenverwaltung. Man kann im Designer oder per Hand Resourcen-Beschreibungen erstellen, und diese dann mittels "pyrcc4" in Python-Module oder mittels "rcc" in Binärdateien umwandeln, die man dann dynamisch nachladen kann. Mehr darüber steht in der Dokumentation von Qt4 und PyQt4.
Benutzeravatar
microkernel
User
Beiträge: 271
Registriert: Mittwoch 10. Juni 2009, 17:27
Wohnort: Frankfurt
Kontaktdaten:

Vielen Dank "lunar"!
Ihr beitrag hat mir auf jeden fall weitergeholfen.
Benutzeravatar
microkernel
User
Beiträge: 271
Registriert: Mittwoch 10. Juni 2009, 17:27
Wohnort: Frankfurt
Kontaktdaten:

Entschuldigung wenn es jetzt vielleicht ein bisschen lästig rüberkommt aber ich habe mir gerade die PyQt4 Docu durchgelesen und verstehe es immer noch nicht wie ich das machen soll.

Ich habe jetzt verstanden wie ich meine ganzen Bilder zu dieser Resource hinzufüge und wie ich sie dann abspeicher.
Aber was soll ich dann mit dieser ".qrc" Datei machen, wenn ich sie so haben will, das ich von meinen Hauptprogramm direkt auf diese Bildern zugreifen kann?

LG
microkernel
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Wenn du den Designer verwendest, musst du nur ``pyrcc4`` auf deine `.qrc` Datei ausführen (Wenn du sie auch richtig als Ressource angegeben hast)

Verwendest du ihn nicht, musst du die erstellte Datei in jedem Skript importieren, in dem du die Bilder verfügbar haben willst. Die Notation (:/*pfad*) kümmert sich um den Rest.
Benutzeravatar
veers
User
Beiträge: 1219
Registriert: Mittwoch 28. Februar 2007, 20:01
Wohnort: Zürich (CH)
Kontaktdaten:

lunar hat geschrieben:@derdon
Dieser Kommentar war ein bisschen überflüssig ... einfacheres Deployment wäre beispielsweise ein Grund, Bilder in die Exe-Datei zu integrieren.
Das ist aber nicht der Grund welcher genannte. Wobei da das Einbetten dagegen nicht viel bringt, reshacker lässt grüssen.

Jonas
[url=http://29a.ch/]My Website - 29a.ch[/url]
"If privacy is outlawed, only outlaws will have privacy." - Phil Zimmermann
Benutzeravatar
microkernel
User
Beiträge: 271
Registriert: Mittwoch 10. Juni 2009, 17:27
Wohnort: Frankfurt
Kontaktdaten:

jetzt hab' ich eine aus dieser .qrc datei eine .py Datei gemacht. Aber WIE kann ich jetzt von meinen Programm aus auf die Bildern, welche jetzt in dieser Python Resourcen Datei sind, zugreifen???

LG
microkernel
Benutzeravatar
microkernel
User
Beiträge: 271
Registriert: Mittwoch 10. Juni 2009, 17:27
Wohnort: Frankfurt
Kontaktdaten:

Ich habe jetztdas Problem gelöst:
Wenn man jetzt die ".qrc" Datei in eine Python Datei, mittels "pyrc4 -o" konvertiert hat, muss man nurnoch im hauptprogramm die Python Datei importieren:

Code: Alles auswählen

import name der datei
und schon kann man im Programm mit folgendem Befehl die Bilder einfügen:

Code: Alles auswählen

QtGui.QIcon(":/präfix/bild.ico")
.


LG
microkernel
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Ich hab da jetzt irgendwie ein Deja-Vu ...
Benutzeravatar
Dill
User
Beiträge: 470
Registriert: Mittwoch 10. Januar 2007, 14:52
Wohnort: Köln

findest du es nicht etwas zu viel verlangt, dass deine antworten auch gelesen werden? :?
http://www.kinderpornos.info
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Ich muss diesen Thread noch mal wiederbeleben, da ich zu blöde bin, das ganze anzuwenden.

Ich habe mit dem Designer ein .ui-File erzeugt und lade das dynamisch in meiner Applikation mittels uic.loadUi(pfad, self).

Zusätzlich habe ich eine Resourcen-Datei erstellt (ebenfalls mit dem Designer), in der sich zwei Icons befinden. Diese Icons kommen jeweils auf einen QPushButton und auch dort habe ich mich im Designer auf die Resource-Datei bezogen.

In der Vorschau sehe ich die Icons auch auf den Buttons - starte ich mein Python-Script jedoch, sehe ich nichts.

Wie muss ich hier vorgehen?

Ich habe auch mittels pyrcc4 ein Modul erstellt und importiere dieses in meinem Python-Script - ohne Erfolg. Die Resourcendatei liegt im selben Verzeichnis wie das .ui-File, die Icons unterhalb dieses Ordners in einem "icon"-Verzeichnis. Die Python-Applikation liegt ein Verzeichnis darüber.

Ich habe also folgende Struktur:

Code: Alles auswählen

/
    script.py
    icons.py
    gui/
        my_widget.ui
        icons.qrc
        icons/
            close.png
            calculate.png
Muss die mittels pyrcc4 kompilierte "icons.py" einen speziellen Namen haben? Inwiefern ist der Prefix wichtig (ich habe ihn "res" genannt).

Sorry, aber aus der Doku von Riverbank (und hier auch der offiziellen Qt-Doku) werde ich nicht schlau.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
lunar

Importierst Du das Resourcen-Modul auch garantiert, bevor Du die UI-Dateien lädst? Alternativ kannst Du übrigens auch "rcc -binary" verwenden, um eine binäre Resourcendatei zu erzeugen. Die kannst Du dann zur Laufzeit über "QResource.registerResource" laden.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

lunar hat geschrieben:Importierst Du das Resourcen-Modul auch garantiert, bevor Du die UI-Dateien lädst?
*narf* Danke für den Hinweis! Ich habe den import in ein anderes Script geschrieben... :oops: (manchmal ist man so richtig fertig... Zeit zum Einkaufen und an die frische Luft gehen!)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Antworten