Icon in .exe-Datei wird nicht im Fenster angezeigt.

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
leo10
User
Beiträge: 11
Registriert: Sonntag 14. Juni 2020, 22:27

Hallo,
ich habe jetzt mein Programm fertig und wollte es jetzt als .exe mit dem PyInstaller über auto-py-to-exe umwandeln und abspeichern.
Dabei hat alles gut funktioniert, allerdings fehlt bei der .exe Datei das Icon des Fensters bei der Ausführung, welches ich über

Code: Alles auswählen

.setWindowIcon(QtGui.QIcon('PDF_Icon.ico'))
dem Fenster zugewiesen habe.
Bei der .py Datei wurde dieses immer angezeigt, jedoch nicht mehr in der umgewandelten .exe.
Ich habe natürlich die Datei unter Additional Files in auto-py-to-exe einzeln hinzugefügt.
Was muss ich machen, damit das Icon angezeigt wird?
Benutzeravatar
__blackjack__
User
Beiträge: 13111
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@leo10: Die Pfadangabe ist ja relativ zum aktuellen Arbeitsverzeichnis des Prozesses. Das wird nicht dort sein, wo die *.py-Datei dann liegt. Keine Ahnung ob `__file__` in dem Modul dann richtig gesetzt ist. So würde man das ohne Umwandlung in eine EXE machen, sich mit `pathlib.Path` und `__file__` den entsprechenden Pfad zusammenbauen.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
leo10
User
Beiträge: 11
Registriert: Sonntag 14. Juni 2020, 22:27

Die *.ico Datei habe ich aktuell im selben Verzeichnis wie die *.py Datei.
Wenn ich aber einen genauen Pfad angebe, dann würde es ja nicht mehr funktionieren, wenn ich die *.exe Datei auf einem anderen Computer verwenden würde.
Benutzeravatar
__blackjack__
User
Beiträge: 13111
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@leo10: Darum ja über den Wert von `__file__`. Das sollte immer der Dateiname/Pfad sein unter dem das Modul erreichbar ist. Da den Dateinamen vom Modul entfernen und durch den Namen der Icon-Datei ersetzen und man hat den Pfad zu dem Icon das im gleichen Verzeichnis liegt. Die `with_name()`-Methode von `Path`-Objekten ist da hilfreich.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
leo10
User
Beiträge: 11
Registriert: Sonntag 14. Juni 2020, 22:27

Ich kenne die Path-Objekte und die genannten Methoden nicht.
Gibt es dazu ausführliche Erklärungen auf einer Webseite oder so?
Ich finde selber leider keine sinnvolle Erklärungen dazu.
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

Erklärungen gibt es immer in der Dokumentation: https://docs.python.org/3/library/pathl ... #basic-use

Code: Alles auswählen

from pathlib import Path
Path(__file__).with_name(''PDF_Icon.ico'')
leo10
User
Beiträge: 11
Registriert: Sonntag 14. Juni 2020, 22:27

Danke.
Muss ich dann einfach die zweite Zeile einer Variable zu ordnen und diese in die .setWindowIcon()-Methode setzen?
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

Ja, am besten als Konstante am Anfang des Moduls:

Code: Alles auswählen

from pathlib import Path
ICON_FILENAME = Path(__file__).with_name("PDF_Icon.ico")

...

window.setWindowIcon(ICON_FILENAME)
leo10
User
Beiträge: 11
Registriert: Sonntag 14. Juni 2020, 22:27

Danke für die gute Erklärung.
In der *.py Datei hat die Implementierung gut funktioniert; man muss nur den Typ der Variable als String setzen, sonst gibt es einen TypeError.
Allerdings wird das Icon dennoch nach dem Umwandeln in eine *.exe Datei nicht angezeigt.

Vielleicht wird die *.ico Datei anders abgespeichert in der *.exe Datei, also in einem extra Verzeichnis.
Kann das sein?

Ich habe jetzt mal die Datei auch mit Konsole konvertiert. Dabei wurde das Icon bei der Konsole angezeigt aber nicht im eigentlichen Fenster. Es kam auch kein Fehler, also muss die *.ico Datei im richtigen Verzeichnis sein.

Wenn ich die *.py als OneDirectory statt OneFile bei auto-py-to-exe in eine *.exe konvertiere, so funktioniert es.
Aber so hab ich ja ein einen Ordner mit Dateien statt eine Datei.
leo10
User
Beiträge: 11
Registriert: Sonntag 14. Juni 2020, 22:27

Ich habe jetzt mal die *.ico Datei in den gleichen Ordner wie meine umgewandelte *.exe Datei. Dann wird das Icon auch angezeigt.
Kann man das auch kompakter lösen?
leo10
User
Beiträge: 11
Registriert: Sonntag 14. Juni 2020, 22:27

Meine Lösung:
Ich habe eine neue *.py erstellt(Window_Icon.py):

Code: Alles auswählen

from pathlib import Path
def pdfIcon():
    pdf = str(Path(__file__).with_name("PDF_Icon.ico"))
    return pdf
Sagt einfach nichts über die Namen...
Und habe dann in der Fenster Datei mich darauf bezogen:

Code: Alles auswählen

PDF_Icon_File = Window_Icon.pdfIcon()
Dialog.setWindowIcon(QtGui.QIcon(PDF_Icon_File))
So funktioniert es.
Antworten