cx_Freeze für den mac

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
GuardDog

Heyho liebe Community,

nachdem ich einen simplen, GUI-basierten Passwordgenerator erstellt habe, möchte ich nun eine .exe und .app erstellen. Das mit der .exe habe ich in cx_Freeze gelöst. Klappt alles. Nachdem ich nun eine .app erstellen wollte, war meine erste Anlaufstelle py2app. Nach mehrfachen Versuchen gelang es mi jedoch nicht, mein Programm auszuführen, ich bekam beim öffnen immer folgenden Fehler: "<Dateiname> Error". Nun habe ich gelesen, dass man mit cx_Freeze auch eine .app erstellen kann. Wie mache ich das? Oder was mache ich bei py2app falsch? :K

Hier mein Code:

Code: Alles auswählen

from tkinter import *
import random, pyperclip, os

chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!?.:,;-_#+*"

def OpenList():
	os.system("start pw_list.txt")

def ClearList():
	os.system("del pw_list.txt")

def generate():
    length = int(length_entry.get())
    password = ""
    if length < 49:
        for c in range(length):
            password += random.choice(chars)
        output_entry.delete(0, END)
        output_entry.insert(END, password)

def clear():
    length_entry.delete(0, END)
    name_entry.delete(0, END)
    output_entry.delete(0, END)

def clipboard():
    print(output_entry.get)
    pyperclip.copy(output_entry.get())
    pyperclip.paste()

def list():
    textfile = open("pw_list.txt", "a")
    textfile.write(name_entry.get() + " - " + output_entry.get() + "\n")
    textfile.close

root = Tk()
root.title("Password Generator")
root.resizable(0,0)
root.iconbitmap("icon.ico")

menu = Menu(root)
root.config(menu=menu)
program_menu = Menu(menu)
list_menu = Menu(menu)
menu.add_cascade(label="Program", menu=program_menu)
menu.add_cascade(label="Password List", menu=list_menu)
program_menu.add_command(label="Exit", command=root.quit)
list_menu.add_command(label="Open list", command=OpenList)
list_menu.add_command(label="Clear list", command=ClearList)

var_width1 = 50
var_width2 = 10

length_entry = Entry(root, width=var_width1, relief="solid", borderwidth=1)
name_entry = Entry(root, width=var_width1, relief="solid", borderwidth=1)
output_entry = Entry(root, width=var_width1, relief="solid", borderwidth=1)
length_clear_button = Button(root, text="Clear", command=clear, width=var_width2, relief="solid", borderwidth=1)
clipboard_button = Button(root, text="Copy", command=clipboard, width=var_width2, relief="solid", borderwidth=1)
list_button = Button(root, text="Store in list", command=list, width=var_width2, relief="solid", borderwidth=1)
generate_button = Button(root, text="Generate", command=generate, width=var_width1 + var_width2, relief="solid", borderwidth=1)

length_entry.insert(END, "password length?")
name_entry.insert(END, "password name?")

length_entry.grid(row=1, column=1)
name_entry.grid(row=2, column=1)
output_entry.grid(row=3, column=1, pady=1)
length_clear_button.grid(row=1, column=2, pady=1)
list_button.grid(row=2, column=2, pady=1)
clipboard_button.grid(row=3, column=2, pady=1)
generate_button.grid(row=4, column=1, columnspan=3, pady=1)
root.mainloop()
__deets__
User
Beiträge: 14540
Registriert: Mittwoch 14. Oktober 2015, 14:29

Der Code wird unter dem mac nicht funktionieren. Das kennt “start” nicht. Und auch nicht del, wobei es etwas sehr durch die Brust ins Auge ist, das mit os.system zu machen, statt ein os.remove zu verwenden.

Des Weiteren ist das anlegen einer Datei ohne vollen Pfad bestenfalls ungeschickt, schlimmstenfalls aber katastrophal, denn du erstellst und löschst die wo es dir gefällt (bzw wo der User das Programm gerade ausführt), und überschreibst und löschst ggf bestehende Daten.

Eine Funktion list zu nennen ist sehr schlecht. Man versteht nicht was sie tut, wenn man es liest, und es gibt list schon in Python. Anderer Code könnte davon dann kaputt gehen.

Und zur eigentlichen Frage: py2app funktioniert für mich tadellos. Da wäre ein voller stacktrace aus der Kommandozeile mal hilfreich.
GuardDog

Hi, danke erstmal für deine schnelle Antwort. Ich habe nicht darüber nachgedacht, dass macOS andere Befehle hat als win :mrgreen:. Naja das Programm ist ja auch noch nicht ganz fertig, ich werde deine Vorschläge beherzigen!
Sirius3
User
Beiträge: 17750
Registriert: Sonntag 21. Oktober 2012, 17:20

@GuardDog: keine *-Importe. Jeden Import in eine eigene Zeile schreiben. Halte Dich an die Namenskonvention: Konstanten schreibt man komplett Groß: CHARS, Funktionen, klein_mit_unterstrich (open_list). Auch wenn Du gar kein externes Programm starten solltest, würde man statt os.system das subprocess-Modul nehmen. »generate« sollte nicht auf Tk-Objekte zugreifen, vor allem nicht auf welche, die es nicht über seine Parameter kennt. Das mit den Parametern gilt ebenso für alle andern Funktionen. Funktionen sollten Tätigkeiten beschreiben, «list» tut das nicht. »close« sollte man auch aufrufen, oder gleich besser das with-Statement verwenden. Alles ab Zeile 36 gehört in eine Funktion, die üblicherweise »main« genannt wird. Dann passiert es auch nicht, dass man in anderen Funktionen aus Versehen auf Dinge außerhalb zugreift.
Antworten