Forum: PC-Programmierung Python importieren von bilder für pyinstaller


von Jochen (Gast)


Lesenswert?

Hi,

ich möchte aus einem Python script eine ausführbare Datei für Windows 
machen. Also eine exe Datei.

Soweit geht das auch, aber wenn ich mit tkinter ein Bild einbinde läuft 
die exe nicht mehr!
1
photo=PhotoImage(file='mail.png')

Die exe wird so erstellt
1
pyinstaller.py --noconsole  D:\python\test.py -F

Wenn ich die neu erstellte exe ausführe bekomme ich folgenden Fehler 
angezeigt.
1
test returned -1

Weiss jemand zufällig wie ich das Problem lösen kann?

von mu (Gast)


Lesenswert?

Ich bin mir nicht ganz sicher, aber meiner Meinung hast du was falsch 
gemacht. Schau dir mal das hier an
https://mborgerson.com/creating-an-executable-from-a-python-script

ich nutze den pyinstaller nicht oft, bei mir hat er aber die letzten 
male immer super funktioniert( das ganze mit QT, CV, pyserial und noch 
weiteren Paketen).

meiner Meinung müsste dein Befehl anders ausschauen.

von Jochen (Gast)


Lesenswert?

Ohne dem Bild in der test.py geht das ohne Probleme mit dem Befehl

von mu (Gast)


Lesenswert?

ich würde mal in das Verzeichnis wechseln, in der deine py liegt.
Ich kann mir noch vorstellen, dass die Angabe des Bilds innerhalb der 
py-Datei absolut ist. Wenn du deine exe aus einem anderen Verzeichnis 
erstellst, findet er dieses absolute Bild nicht. Also davor
cd D:\python\
und dannach halt die exe ohne ganzen Pfad erstellen.

von Jochen (Gast)


Lesenswert?

Hi,

das macht leider auch keinen unterschied :-(

von mu (Gast)


Lesenswert?

dann gilt wie immer: zeig her deinen code

von mu (Gast)


Lesenswert?

und: die option -debug gibt mehr ausgaben über den pack prozess

von Bernd W. (berndwiebus) Benutzerseite


Lesenswert?

Hallo Jochen.

Jochen schrieb:
> Ohne dem Bild in der test.py geht das ohne Probleme mit dem Befehl

Ich kenne mich weder mit Python unter Windows noch dem Pythoninstaller 
aus.

Aber ich habe trozdem den Verdacht, dass es

A) daran liegt, dass Du auf eine Datei zugreifst, die ausserhalb des 
Skriptes liegt.

B) Ausserdem kann photoimage nativ nur GIF und PGM/PPM Formate. Ob PNG 
so ohne weiteres in PGM/PPM subsumierbar ist, weiss ich nun auch nicht, 
aber anscheinend scheint es ja bei Dir ohne den Pythoninstaller zu 
funktionieren.

Möglicherweise ist aber dort noch etwas zwischengeschaltet, das der 
Pythoninstaller nicht verarbeiten kann.

zu A)
In Python gibt es die Möglichkeit, die Bilder base64 gewandelt direkt in 
den Code einzufügen ("inline").
zu base64: https://de.wikipedia.org/wiki/Base64
Es gibt für Python3 ein eigenes base64 modul:
https://docs.python.org/3/library/base64.html
Das kannst Du zum Wandeln schon verwenden. In Deinem Falle aber nicht im 
code, sondern manuell in der Konsole, und das Gewandelte dann in den 
Code einbringen.


Zu B)
Wandle das Bild halt in GIF um, und verwende dieses. Auch GIF lässt sich 
dann noch base64 wandeln.


Beispiel mit Python3: 
https://www.mikrocontroller.net/wikifiles/f/f6/PyKiCad-CaseSensitiveLibCure_RevD_13Apr2015.zip 
Die Buttonbilder für die Sprachumschaltung sind dort so eingebunden.

Mit freundlichem Gruß: Bernd Wiebus alias dl1eic
http://www.l02.de

: Bearbeitet durch User
von Jochen (Gast)


Lesenswert?

Hi,

ich versuche gerade die ersten versuche mit base64, muss ich mir für 
Python3 base64 erst installieren?
1
import base64
2
3
original_string = 'This is the data, in the clear.'
4
print ('Original:', original_string)
5
6
encoded_string = base64.b16encode(original_string)
7
print ('Encoded :', encoded_string)
8
9
decoded_string = base64.b16decode(encoded_string)
10
print ('Decoded :', decoded_string)

1
Original: This is the data, in the clear.
2
Traceback (most recent call last):
3
  File "D:\python\base64.py", line 1, in <module>
4
    import base64
5
  File "D:\python\base64.py", line 6, in <module>
6
    encoded_string = base64.b16encode(original_string)
7
AttributeError: 'module' object has no attribute 'b16encode'

von Bernd W. (berndwiebus) Benutzerseite


Angehängte Dateien:

Lesenswert?

Hallo jochen.

Jochen schrieb:

> ich versuche gerade die ersten versuche mit base64, muss ich mir für
> Python3 base64 erst installieren?

Zumindest in Debian Jessy nicht.

Das sollte so funktionieren wie im Screenshot 
"Python3_Base64-Encoding_06Mar2016.png" im Anhang.


>
1
> Original: This is the data, in the clear.
2
> Traceback (most recent call last):
3
>   File "D:\python\base64.py", line 1, in <module>
4
>     import base64
5
>   File "D:\python\base64.py", line 6, in <module>
6
>     encoded_string = base64.b16encode(original_string)
7
> AttributeError: 'module' object has no attribute 'b16encode'
8
>

Da läuft irgendwas mit dem Namen oder/und mit der Art der Daten krum.

Siehe:
https://docs.python.org/3/library/base64.html
und
http://stackoverflow.com/questions/8908287/base64-encoding-in-python-3

Mit freundlichem Gruß: Bernd Wiebus alias dl1eic
http://www.l02.de

von Kaj G. (Firma: RUB) (bloody)


Lesenswert?

Jochen schrieb:
> muss ich mir für
> Python3 base64 erst installieren?
Nein, das gehört zu den standard Python Modulen. Müsstest du es erst 
installieren, dann würde das ganze schon beim import scheitern.

Die encode() funktion möchte ein Byte-Objekt haben, kein String.

Also:
1
original_string = b'This is the data, in the clear.'
statt:
1
original_string = 'This is the data, in the clear.'

von Jochen (Gast)


Lesenswert?

Habe es nochmal eine neue Python Datei erstellt. Nun geht es...


Bisher habe ich das Bild so eingebunden


photo=PhotoImage(file='mail.gif')


Jetzt habe ich das Bild encodet. Wie kann ich das nun wieder als Bild 
anzeigen lassen?

von gst (Gast)


Lesenswert?

Mit decode

von Sebastian (Gast)


Lesenswert?

sowas in der Art müsste gehen.
1
image_output = cStringIO.StringIO()
2
image_output.write(data.decode('base64')) 
3
image_output.seek(0)
4
photo=PhotoImage(file='image_output')

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.