Ist das dumm (Programmieren)?
Hallo,
Ich habe mit Python und customtkinter ein kleines Programm gemacht, dass (Bild) Datein dem Erstellungsdatum nach in Order und Unterordner einordnet (das Programm existierte bereits als Skript, hab damit meine gesamte Fotomediathek aufgeräumt). Da meine Mutter und eine weiter Person Interessie gezeigt haben, hab ich mit dem Customtkinter Paket eine GUI gemacht, die auch eine Bilddatei enthält (ja, es muss schön aussehen, hab mir lange Mühe gegeben mit den Farben und dem Layout).
Um das Programm auch für andere nutzbar zu machen, nutze ich Pyinstaller, aktuell nur auf meinem eigenen Linux System, später hab ich auch noch vor eine Windows Version mit einer VM zu machen.
Um das Programm also einfach benutzbar machen zu können, hab ich die --onefile Option genommen. Das Bild war über eine Pfad importiert und musste deshalb immer im gleichen Order sein :(. Nach motivierter Recherche, das Programm wirklich --onefile zu machen, hab ich das Bild (und andere Ressourcen) mit base64 als String in einer Ressourcen.py Datei gespeichert, die als Import von Pyinstaller automatisch mit eigefügt wird.
Ist das dumm das so zu machen (Ich hab grade erst mit dem Programmieren angefangen)?
2 Antworten
Du hast Probleme identifiziert und Lösungen gefunden. Programme erst für die Kommandozeile zu bauen, und später ein GUI zu entwickeln und über andere Plattformen nachzudenken, ist üblich, sowie auch das Einbinden von Ressourcen. Die Ansätze sind natürlich nicht die einzige oder endgültige Lösung, aber wunderbar um erste Erfahrungen zu sammeln, sowie generell sicher und nicht unüblich. Lass dich da nicht verunsichern.
Alles also absolut korrekt und ich denke, du hast viel gelernt. Mach so weiter! Scheue dich nicht, interessante Technologien auszuprobieren und dich breitzumachen.
Wenn ich etwas aus deinem Text nicht aufgegriffen habe, stell gerne eine Nachfrage.
Schau in die Dokumentation von PyInstaller. Du kannst Dateien mit der --add-data-Option zum Buildpaket hinzufügen:
pyinstaller --onefile --add-data "your_picture.jpg:." your_script.py
oder du listest alle Dateien innerhalb der .spec-Datei auf.
Zur Laufzeit der Anwendung werden die Bilder in ein temporäres Verzeichnis gepackt. Du kannst dir mit einer Funktion den korrekten Pfad holen:
import os
def get_image_path(relative_file_path):
if hasattr(sys, "_MEIPASS"):
return os.path.join(sys._MEIPASS, relative_file_path)
return relative_file_path
Deine Base64-Lösung ist eher ein Workaround, bei dem man auch schauen sollte, inwiefern der String die Speichergröße (und vielleicht auch Ladezeit) deiner tatsächlichen Anwendung beeinflusst.