diff --git a/gui.py b/gui.py index b537f56..6d0c8bc 100644 --- a/gui.py +++ b/gui.py @@ -5,14 +5,35 @@ import sys import os from PIL import Image, ImageTk import webbrowser +import winreg + +if getattr(sys, 'frozen', False): + # Wenn das Skript in einer exe läuft, sind die Dateien im temporären Ordner + bundle_dir = sys._MEIPASS + pdf_export_path = os.path.join('./export.exe') +else: + # Wenn das Skript nicht in einer exe läuft, benutze das aktuelle Arbeitsverzeichnis + bundle_dir = os.path.dirname(os.path.abspath(__file__)) + pdf_export_path = os.path.join('./export.exe') + +print(pdf_export_path) +# Pfade für eingebundene Ressourcen +logo_path = os.path.join(bundle_dir, 'logo.png') +gif_path = os.path.join(bundle_dir, 'printer.gif') +reg_check_path = os.path.join(bundle_dir, 'reg_check.py') + + +icon_path = os.path.join(bundle_dir, 'printer.ico') class CustomerThinkerApp(ctk.CTk): def __init__(self): super().__init__() + self.iconbitmap(icon_path) # Setzt das Icon + self.title("CustomerThinker PDF Export Tool") window_width = 400 - window_height = 400 + window_height = 450 # Bildschirmgröße ermitteln screen_width = self.winfo_screenwidth() @@ -27,7 +48,7 @@ class CustomerThinkerApp(ctk.CTk): ctk.set_appearance_mode("System") # "Dark", "Light", "System" ctk.set_default_color_theme("blue") # Andere Themes: "green", "dark-blue" - self.script_path = "pdf_export.py" + self.script_path = pdf_export_path # Verändere dies auf den richtigen Pfad self.labels_dir = "label" self.orders_dir = "orders" @@ -55,7 +76,7 @@ class CustomerThinkerApp(ctk.CTk): self.dropdown_select.pack(pady=10) # Werte-Dropdown - self.dropdown_values = ctk.CTkComboBox(self, values=[], command=self.file_selected,width=200) + self.dropdown_values = ctk.CTkComboBox(self, values=[], command=self.file_selected, width=200) self.dropdown_values.pack(pady=10) # Status @@ -67,7 +88,7 @@ class CustomerThinkerApp(ctk.CTk): self.status_label_logo.pack(pady=10) # Logo unten rechts - self.logo_image = ctk.CTkImage(Image.open("logo.png"), size=(50, 50)) # Hier dein Logo + self.logo_image = ctk.CTkImage(Image.open(logo_path), size=(50, 50)) # Hier dein Logo self.logo_label = ctk.CTkLabel(self, image=self.logo_image, text="", fg_color="transparent") self.logo_label.bind("", self.open_link) # Klick-Event self.logo_label.bind("", self.on_logo_hover) # Hover-Ereignis (Maus über Logo) @@ -81,10 +102,8 @@ class CustomerThinkerApp(ctk.CTk): # Einmaliges Binden: Position von Logo UND Button aktualisieren self.bind("", self.update_positions) - def run_reg_check(self): - script_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), "reg_check.py") - subprocess.Popen([sys.executable, script_path]) + show_config_gui(self) # Direkter Aufruf, kein Thread! def update_positions(self, event=None): # Logo rechts unten @@ -102,12 +121,7 @@ class CustomerThinkerApp(ctk.CTk): def on_logo_leave(self, event=None): self.logo_label.configure(cursor="") # Setzt den Cursor zurück, wenn die Maus das Logo verlässt - def update_logo_position(self, event=None): - # Positioniere das Logo in der unteren rechten Ecke, nachdem das Fenster die endgültige Größe hat - self.logo_label.place(x=self.winfo_width() - 10, y=self.winfo_height() - 10, anchor="se") - def load_gif(self): - gif_path = "printer.gif" if not os.path.exists(gif_path): return @@ -150,6 +164,7 @@ class CustomerThinkerApp(ctk.CTk): self.run_button.configure(text=f"{selected_file} drucken", command=lambda: self.run_single_file(full_path)) def run_script(self): + print("run_script") self.set_status("Alle Aufträge werden gedruckt...", "blue") self.start_animation() threading.Thread(target=self.execute_script).start() @@ -162,7 +177,9 @@ class CustomerThinkerApp(ctk.CTk): def execute_script(self): try: - result = subprocess.run([sys.executable, self.script_path], capture_output=True, text=True) + print("execute_script") + print(self.script_path) + result = subprocess.run([self.script_path], capture_output=True, text=True) if result.returncode == 0: self.set_status("✅ Alle Aufträge wurden gedruckt!", "green") else: @@ -176,7 +193,7 @@ class CustomerThinkerApp(ctk.CTk): def execute_single_file(self, full_path): try: - result = subprocess.run([sys.executable, self.script_path, full_path], capture_output=True, text=True) + result = subprocess.run([self.script_path, full_path], capture_output=True, text=True) if result.returncode == 0: filename = os.path.basename(full_path) self.set_status(f"✅ {filename} wurde gedruckt!", "green") @@ -210,6 +227,95 @@ class CustomerThinkerApp(ctk.CTk): def show_error(self, message): ctk.CTkMessagebox(title="Fehler", message=message, icon="cancel") if hasattr(ctk, "CTkMessagebox") else print(message) +REG_PATH = r"Software\PDFExporter" + +def read_registry_value(name): + try: + key = winreg.OpenKey(winreg.HKEY_CURRENT_USER, REG_PATH, 0, winreg.KEY_READ) + value, _ = winreg.QueryValueEx(key, name) + winreg.CloseKey(key) + return value + except FileNotFoundError: + return None + +def write_registry_value(name, value): + try: + key = winreg.CreateKey(winreg.HKEY_CURRENT_USER, REG_PATH) + winreg.SetValueEx(key, name, 0, winreg.REG_SZ, value) + winreg.CloseKey(key) + except Exception as e: + print(f"Fehler beim Schreiben in Registry: {e}") + +# def config_exists(): +# return read_registry_value("APIKey") is not None + +def save_config_and_close(api_entry, server_entry, label_entry, order_entry, app): + write_registry_value("APIKey", api_entry.get()) + write_registry_value("Server", server_entry.get()) + write_registry_value("LabelPrinter", label_entry.get()) + write_registry_value("OrderPrinter", order_entry.get()) + app.destroy() + +def show_config_gui(parent): + ctk.set_appearance_mode("System") + ctk.set_default_color_theme("blue") + + app = ctk.CTkToplevel(parent) + app.iconbitmap(icon_path) + app.title("Erstkonfiguration") + window_width = 400 + window_height = 400 + + # Bildschirmgröße ermitteln + screen_width = app.winfo_screenwidth() + screen_height = app.winfo_screenheight() + + # Position zum Zentrieren berechnen + x = int((screen_width / 2) - (window_width / 2)) + y = int((screen_height / 2) - (window_height / 2)) + app.geometry(f"{window_width}x{window_height}+{x}+{y}") + + frame = ctk.CTkFrame(master=app) + frame.pack(pady=20, padx=20, fill="both", expand=True) + + # Vorhandene Werte aus der Registry lesen + existing_api = read_registry_value("APIKey") or "" + existing_server = read_registry_value("Server") or "" + existing_label = read_registry_value("LabelPrinter") or "" + existing_order = read_registry_value("OrderPrinter") or "" + + # GUI Felder + api_label = ctk.CTkLabel(master=frame, text="API Key:") + api_label.pack(pady=5) + api_entry = ctk.CTkEntry(master=frame, width=300) + api_entry.insert(0, existing_api) + api_entry.pack() + + server_label = ctk.CTkLabel(master=frame, text="Server:") + server_label.pack(pady=5) + server_entry = ctk.CTkEntry(master=frame, width=300) + server_entry.insert(0, existing_server) + server_entry.pack() + + label_label = ctk.CTkLabel(master=frame, text="Label-Drucker:") + label_label.pack(pady=5) + label_entry = ctk.CTkEntry(master=frame, width=300) + label_entry.insert(0, existing_label) + label_entry.pack() + + order_label = ctk.CTkLabel(master=frame, text="Order-Drucker:") + order_label.pack(pady=5) + order_entry = ctk.CTkEntry(master=frame, width=300) + order_entry.insert(0, existing_order) + order_entry.pack() + + save_button = ctk.CTkButton(master=frame, text="Speichern", command=lambda: save_config_and_close( + api_entry, server_entry, label_entry, order_entry, app)) + save_button.pack(pady=15) + app.focus() # Setzt den Fokus + app.grab_set() # Macht das Fenster modal + app.lift() # Holt es in den Vordergrund + if __name__ == "__main__": app = CustomerThinkerApp() app.mainloop() diff --git a/pdf_export.py b/pdf_export.py index 40b7576..091423a 100644 --- a/pdf_export.py +++ b/pdf_export.py @@ -7,7 +7,7 @@ import fitz # PyMuPDF import win32print import win32ui from PIL import Image, ImageWin -import winreg # ← Registry-Zugriff +import winreg os.system("chcp 65001") # Registry-Pfad diff --git a/printer.ico b/printer.ico new file mode 100644 index 0000000..abb63a8 Binary files /dev/null and b/printer.ico differ