Frage zu wxPython und Ressourcen

Plattformunabhängige GUIs mit wxWidgets.
burli
User
Beiträge: 1116
Registriert: Dienstag 9. März 2004, 18:22

Frage zu wxPython und Ressourcen

Beitragvon burli » Montag 5. Mai 2008, 18:37

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?
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Re: Frage zu wxPython und Ressourcen

Beitragvon Leonidas » Montag 5. Mai 2008, 18:49

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.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Re: Frage zu wxPython und Ressourcen

Beitragvon gerold » Montag 5. Mai 2008, 20:34

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
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
burli
User
Beiträge: 1116
Registriert: Dienstag 9. März 2004, 18:22

Beitragvon burli » Montag 5. Mai 2008, 20:42

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
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Beitragvon gerold » Montag 5. Mai 2008, 21:27

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
:-)
http://halvar.at | Kleiner Bascom AVR Kurs

Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
burli
User
Beiträge: 1116
Registriert: Dienstag 9. März 2004, 18:22

Beitragvon burli » Montag 5. Mai 2008, 21:38

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
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Montag 5. Mai 2008, 22:34

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.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
burli
User
Beiträge: 1116
Registriert: Dienstag 9. März 2004, 18:22

Beitragvon burli » Dienstag 6. Mai 2008, 07:04

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
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Beitragvon gerold » Dienstag 6. Mai 2008, 07:17

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
:-)
http://halvar.at | Kleiner Bascom AVR Kurs

Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
burli
User
Beiträge: 1116
Registriert: Dienstag 9. März 2004, 18:22

Beitragvon burli » Dienstag 6. Mai 2008, 07:27

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
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Dienstag 6. Mai 2008, 09:31

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.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
burli
User
Beiträge: 1116
Registriert: Dienstag 9. März 2004, 18:22

Beitragvon burli » Dienstag 6. Mai 2008, 09:37

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:
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Dienstag 6. Mai 2008, 09:43

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.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
burli
User
Beiträge: 1116
Registriert: Dienstag 9. März 2004, 18:22

Beitragvon burli » Dienstag 6. Mai 2008, 09:58

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

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder