Seite 1 von 1
EXE erstellen
Verfasst: Montag 25. September 2023, 15:51
von nikh22
Hallo liebe Leute,
ich habe ein für mich wirklich umfangreiches Programm geschrieben, mit einer GUI mit tkinter.
Die Struktur, also das Projektverzeichnis, sieht wie folgt aus:
gui.py (Frontend)
functions_frontend.py
main.py (Backend)
functions_backend.py
[folder]: pictures_tools
[folder:] pictures_exporter
In meiner GUI werden Daten eingegeben und Pfade ausgewählt die an die main.py weitergegeben werden und durch drücken eines Start-Knopfes in der GUI wird die main.py gestartet. Die main.py wiederum braucht die Ordner pictures_tools und pictures_exporter.
Die gui.py implementiert mehrere Funktionen aus functions_frontend.py und die main.py aus functions_backend.py.
Wie kann ich nun daraus eine exe-datei machen?
Wenn möglich würde ich gerne das festgelegte Icon behalten. Wäre aber nur nice to have.
Die Befehle:
pyinstaller --onefile main.py
sowie
pyinstaller --onefile gui.py
funktionieren leider beide nicht, obwohl ich alles in einem Projektverzeichnis habe.
Kann mir jemand sagen wie ich das Problem löse?
Re: EXE erstellen
Verfasst: Montag 25. September 2023, 15:56
von __deets__
Was heisst funkionieren nicht? Denn grundsaetzlich ist das schon das richtige Vorgehen, pyinstaller zu benutzen.
Re: EXE erstellen
Verfasst: Montag 25. September 2023, 16:25
von __blackjack__
Hat nichts mit der EXE zu tun, aber die Struktur ist komisch. Beim Namen `main` würde man erwarten das *das* der Einstiegspunkt ist.
`functions_*` hat in den Namen nichts zu suchen. Wenn da dann mal eine Klasse dazu kommen sollte, stimmt der Modulname plötzlich nicht mehr, obwohl sich an der Bedeutung der Module im Grunde nichts geändert hat. Funktionen sind ja auch kein Aufteilungskriterium. Module fassen Funktionen *und* Klassen zusammen, die zusammengehören. Man teilt nicht in Module mit Klassen und Module mit Funktionen auf. Das ist als wenn man Bücher nach der Farbe oder der Grösse, oder ob Hardcover oder Softcover ordnen würde, statt sinnvoll thematisch nach Inhalt.
Dann noch etwas das vielleicht tatsächlich mit der EXE zu tun hat: Was heisst denn „… wird die main.py gestartet“? Das *sollte* heissen, das dieses Modul importiert wurde und dann dort eine Funktion aufgerufen wird. Das sollte nicht heissen, dass da versucht wird mit `subprocess` oder etwas ähnlichem tatsächlich ein neues Programm zu starten.
Re: EXE erstellen
Verfasst: Montag 25. September 2023, 17:40
von DeaD_EyE
funktionieren leider beide nicht, obwohl ich alles in einem Projektverzeichnis habe.
Mein Auto springt nicht an. Es ist schwarz. Woran liegt das?
Re: EXE erstellen
Verfasst: Dienstag 26. September 2023, 07:45
von nikh22
Ist ja gut habe verstanden, dass nicht funktionieren nicht wirklich hilfreich ist. Wenn ich die .exe starte egal welchen der beiden gezeigten pyinstaller Befehle ich verwende, öffnet sich ein schwarzes Fenster was sich kurz darauf wieder schließt.
Sollte ich die ganzen Funktionen jeweils in die eigene Datei inkludieren? Das sind jeweils bestimmt 10 Funktionen.
Die main.py wird über subprocess.popen([python_interpreter, 'main.py', path_var.()]) geöffnet.
Re: EXE erstellen
Verfasst: Dienstag 26. September 2023, 09:28
von Sirius3
Nein, das heißt nicht, dass Du alles in eine Datei packst, sondern nur, dass Du Deinen Modulen bessere Namen geben solltest, also was die 10 Funktionen denn gemeinsam haben.
Genauso solltest Du die Funktionalität in >main.py< als Funktion verfügbar machen, die Du einfach in der GUI.py importieren kannst und direkt aufrufen, statt über subprocess zu gehen.
Python-Programme startet man in der "Eingabeaufforderung" so dass man auch die Fehlermeldung sehen kann. Wenn Du das machst, was kommt für eine Meldung?
Re: EXE erstellen
Verfasst: Dienstag 26. September 2023, 14:03
von nikh22
Vielen Dank für den Tipp mit der Eingabeaufforderung.
Dadurch habe ich herausgefunden, dass das Icon für die Anwendung nicht gelesen werden konnte.
Nun habe ich den entsprechenden Befehl angepasst und alles funktioniert problemlos.
Befehl : pyinstaller --onefile --icon='symbol.ico' gui.py
(für jemandem mit einem ähnlichen, die Datei liegt im root-Verzeichnis, ansonsten relativen oder absoluten Pfad angeben)
Die >main.py> funktioniert jetzt auch als Funktion ohne subprocess zu nutzen.
Vielen Dank für eure Antworten.