Seite 1 von 1

Frage zu wxPython und Ressourcen

Verfasst: Montag 5. Mai 2008, 18:37
von burli
Hi,
ich habe noch ein Problem in wxPython für das ich noch keine Antwort habe.

Wenn ich in einer Applikation Icons oder andere Ressourcen verwenden möchte kann ich diese zb in ein Unterverzeichnis legen. In der Applikation kann ich dann zb via images/new.png oder ähnlich darauf zugreifen.

Ich hab das ganze mal mit dem File Hunter aus diesem Tutorial ausprobiert. Ich habe daraus eine Datei filehunter.py erstellt und in dem Verzeichnis ein Unterverzeichnis images mit entsprechenden Icons darin.

sofern ich filehunter.py aus seinem Verzeichnis starte funktioniert auch alles. Aber wenn ich zb eine Ebene weiter oben bin und das Programm mit python tmp/filehunter.py starte findet er die images nicht mehr.

In Qt ist das durch Ressource Files gelöst. Das sind normale Python Module die die Images als Binäre Daten enthalten und einfach importiert werden.

Wie ist das bei wxPython gelöst?

Re: Frage zu wxPython und Ressourcen

Verfasst: Montag 5. Mai 2008, 18:49
von Leonidas
burli hat geschrieben:Wie ist das bei wxPython gelöst?
Du kannst ja auch den Pfad konstruieren, indem zu zum Ordnerpfad in dem das Modul liegt einfach noch den Pfad des Unterordners und ann den Dateinamen dran hängst. Das ist an sich auch nicht wxPython-spezifisch.

Re: Frage zu wxPython und Ressourcen

Verfasst: Montag 5. Mai 2008, 20:34
von gerold
burli hat geschrieben:Aber wenn ich zb eine Ebene weiter oben bin und das Programm mit python tmp/filehunter.py starte findet er die images nicht mehr.
Hallo burli!

Du musst dich nur darum kümmern, "absolute Pfade" zu verwenden. Eine kleine Hilfe könnte http://halvar.at/python/programmpfade_ermitteln/ sein. Und http://docs.python.org/lib/module-os.path.html und ganz besonders ``os.path.join`` sollte dir weiter helfen.

mfg
Gerold
:-)

Verfasst: Montag 5. Mai 2008, 20:42
von burli
Ok, danke. Ich überlege noch wie ich das lösen werden.

Vielleicht kann man die Variante von Qt mit den Ressourcen Dateien irgendwie portieren. Ich finde das nicht unpraktisch und löst die Probleme mit den Pfaden

Außerdem will ich schauen das ich unter Linux auch die Icons des aktuellen Themes verwende und nur wenn nichts passendes verfügbar ist auf einen "Standardsatz" von Icons zurückgreife

Verfasst: Montag 5. Mai 2008, 21:27
von gerold
Hallo burli!
burli hat geschrieben:Ich überlege noch wie ich das lösen werden.

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: iso-8859-15 -*-

import os
import sys
import wx


APPDIR = os.path.dirname(os.path.abspath(sys.argv[0]))
IMAGESDIR = os.path.join(APPDIR, "images")
LOGDIR = os.path.join(APPDIR, "log")


#... irgendwo im Code
image1_path = os.path.join(IMAGESDIR, "first_image.png")
image1 = wx.Image(image1_path)

#... irgendwo im Code
image2_path = os.path.join(IMAGESDIR, "second_image.png")
image2 = wx.Image(image2_path)
burli hat geschrieben:Ressourcen Dateien
Die Bilder, die von der wxPython-Demo verwendet werden, sind in Python-Dateien eingebettet. Suche im Python-Ordner nach der Dateie mit dem Namen "img2py.py". Aber die Bilder und sonstige Ressourcen einfach in einen Ordner legen ist einfacher. Viel einfacher sogar.

burli hat geschrieben:Außerdem will ich schauen das ich unter Linux auch die Icons des aktuellen Themes verwende und nur wenn nichts passendes verfügbar ist auf einen "Standardsatz" von Icons zurückgreife
Dafür gibt es den *ArtProvider*. Diesem ArtProvider kann man benutzerdefinierte Icons/Images zuweisen. Und nur dann, wenn es kein benutzerdefiniertes Bild gibt, dann nimmt er das Standardbild. Suche in der Demo danach.

Ich weiß nicht mehr, wofür ich dieses Beispiel programmierte. http://paste.pocoo.org/show/47597/ Ich glaube, ich habe es nie irgendwo eingesetzt.

mfg
Gerold
:-)

Verfasst: Montag 5. Mai 2008, 21:38
von burli
Das Beispiel ist cooool :D danke dafür. Das img2py.py werd ich mir auch mal rausfischen.

Ich werd mal probieren was einfacher ist. Ressourcen in Ressorcendateien packen oder auf unterschiedlichen Plattformen mit Pfaden jonglieren

Verfasst: Montag 5. Mai 2008, 22:34
von Leonidas
gerold hat geschrieben:Aber die Bilder und sonstige Ressourcen einfach in einen Ordner legen ist einfacher. Viel einfacher sogar.
Und sauberer und unproblematischer. So kann man solche Ressourcen ohne weiteres in einem Programm öffnen und weiterverarbeiten, wohingegen man sie sonst erst aus dem Quelltext wieder extrahieren muss.

Verfasst: Dienstag 6. Mai 2008, 07:04
von burli
Leonidas hat geschrieben:... wohingegen man sie sonst erst aus dem Quelltext wieder extrahieren muss.
Extrahieren nicht unbedingt. Man kann die Icons ja in einem Unterverzeichnis lassen. Man muss dann nach der Änderung nochmal img2py.py starten.

Man könnte beim Programmstart die Daten der Icons im Verzeichnis mit denen im Ressourcen File vergleichen und bei Änderungen automatisch img2py.py aufrufen. Das würde den Programmstart halt etwas verlängern

Verfasst: Dienstag 6. Mai 2008, 07:17
von gerold
burli hat geschrieben:Man könnte beim Programmstart die Daten der Icons im Verzeichnis mit denen im Ressourcen File vergleichen und bei Änderungen automatisch img2py.py aufrufen.
Hallo burli!

:roll: :?

mfg
Gerold
:-)

Verfasst: Dienstag 6. Mai 2008, 07:27
von burli
gerold hat geschrieben:Hallo burli!

:roll: :?
Ist dir zu umständlich? ;) Ich weiß, ich denke immer um die Ecke und vor allem immer 3 Schritte weiter als notwendig, aber manchmal kommt was brauchbares dabei rum

Verfasst: Dienstag 6. Mai 2008, 09:31
von Leonidas
burli hat geschrieben:Ist dir zu umständlich? ;) Ich weiß, ich denke immer um die Ecke und vor allem immer 3 Schritte weiter als notwendig, aber manchmal kommt was brauchbares dabei rum
Ja, das ist nicht nur umständlich sondern auch redundant. Damit wirst du zum Beispiel ein Problm haben, wenn man dein Programm in ``/usr`` installiert, wo es normalerweise keine Schreibrechte gibt.

Verfasst: Dienstag 6. Mai 2008, 09:37
von burli
Leonidas hat geschrieben:Ja, das ist nicht nur umständlich sondern auch redundant. Damit wirst du zum Beispiel ein Problm haben, wenn man dein Programm in ``/usr`` installiert, wo es normalerweise keine Schreibrechte gibt.
Indeed, aber eigentlich sollte keiner an den Programmicons rumschrauben. However, ich werd erstmal schauen was der ArtProvider alles bietet.

Unter Linux würde ich das Problem sowieso umgehen indem ich ein Paket zusammenbaue und die Icons in /usr/share/ verstaue. Ich muss nur mal schauen wie ich das unter Windows mache :roll:

Verfasst: Dienstag 6. Mai 2008, 09:43
von Leonidas
burli hat geschrieben:Unter Linux würde ich das Problem sowieso umgehen indem ich ein Paket zusammenbaue und die Icons in /usr/share/ verstaue. Ich muss nur mal schauen wie ich das unter Windows mache :roll:
Eben, und da musst du dann sowieso wieder "normale" Icons verwenden und den Pfad zu den Icons im Programm konstruieren. Daher kannst du dir das Einbetten der Icons in Python-Dateien auch sparen.

Verfasst: Dienstag 6. Mai 2008, 09:58
von burli
Leonidas hat geschrieben:Eben, und da musst du dann sowieso wieder "normale" Icons verwenden und den Pfad zu den Icons im Programm konstruieren. Daher kannst du dir das Einbetten der Icons in Python-Dateien auch sparen.
Meine Überlegung ging halt in die Richtung für alle Systeme einen einheitlichen Code zu erstellen. Das ginge am einfachsten mit Ressource Dateien. Da braucht man sich um Pfade nicht zu kümmern

Ich hoffe ich komme diese Woche mal richtig zum programmieren. Dann werde ich das in aller Ruhe mal ausprobieren. Genug Vorschläge zum Testen hab ich ja jetzt :D