Seite 1 von 1

Woher stammt der Dateipfad bei Fehlermeldung aus kompilierter EXE (cx_freeze)

Verfasst: Mittwoch 10. August 2022, 23:09
von Torres87
Hallo,

ich habe ein Python-Programm mit meinem privaten Laptop erstellt und das Programm mittels cx_freeze kompiliert (als standalone EXE). Diese Programm dann meinem Arbeitgeber gegeben und aufgespielt. Das Programm lief bisher sehr gut und nun kam ein Fehler der den Pfad meines privaten Laptops aufzeigt, siehe Bild. Die Ursache des Fehlers ist mir bekannt und sehr trivial. Es fehlt die logo.gif (Startsymbol / Startscreen des Programms). In meinem Code sieht es wie folgt aus:

Code: Alles auswählen

# # Splash-Screen (Lade-Symbol am Start)
root     = Tk()
img_file = "logo.gif"
image    = PhotoImage(file=img_file)
w,h      = image.width(), image.height()
screen_width  = root.winfo_screenwidth()
screen_height = root.winfo_screenheight()
x = (screen_width  / 2) - (w / 2)
y = (screen_height / 2) - (h / 2)
root.overrideredirect(True)
root.geometry(f'{w}x{h}+{int(x)}+{int(y)}')
canvas = Canvas(root, highlightthickness=0)
canvas.create_image(0,0, image=image, anchor='nw')
canvas.pack(expand=1,fill='both')
root.after(2000, root.destroy)
root.mainloop()
Meine Frage ist warum wird in dem Fehler mein prviater Pfad angezeigt. WIe kann man das verhindern? Mein Arbeitgeber war im ersten Moment etwas besorgt weil er dachte mein Code macht im Hintergrund unschöne Sachen... Ich hoffe ihr wisst was ich meine. Danke

Bild

Re: Woher stammt der Dateipfad bei Fehlermeldung aus kompilierter EXE (cx_freeze)

Verfasst: Donnerstag 11. August 2022, 06:33
von __deets__
Weil cx_freeze die kompilierten PYC-Dateien verpackt. Und die enthalten den vollen Pfad auf der Maschine, auf der sie übersetzt wurden. Ich bezweifle, das du daran was ändern kannst. Es ist aber auch vollkommen harmlos.

Das der Code kracht, ist im übrigen nicht verwunderlich: der funktioniert nur unter bestimmten Randbedingungen. Nämlich wenn das Arbeitsverzeichnis korrekt ist, denn nur dann kann der Dateinamen des Bildes korrekt aufgelöst werden. Weil es ein relativer Pfad ist, und relative Pfade IMMER unter Zuhilfenahme des Arbeitsverzeichnisses zu absoluten gewandelt werden, bevor sie für Vorgänge wie lesen oder schreiben genutzt werden.

Der Code sollte daher robuster geschrieben werden. Siehe https://cx-freeze.readthedocs.io/en/lat ... data-files

Re: Woher stammt der Dateipfad bei Fehlermeldung aus kompilierter EXE (cx_freeze)

Verfasst: Donnerstag 11. August 2022, 07:22
von Sirius3
Zudem: Du scheinst *-Importe zu benutzen. TkInter wird immer über `import tkinter as tk` importiert.
Es scheint keine main-Funktion zu geben und mehr als eine Tk-Instanz benutzt zu werden.
Wenn Du eigentlich ints willst, warum rechnest Du dann mit floats (`x = (screen_width - w) // 2`)?
Und letzlich: warum nervst Du die Nutzer damit, zwei Sekunden lang ein doofes Bild anzuschauen. Wenn im Hintergrund tatsächlich etwas gemacht wird, ist das ok, aber so!?