change Readme
parent
eddd0cc66a
commit
4f49e34ca9
132
gui.py
132
gui.py
|
|
@ -5,14 +5,35 @@ import sys
|
||||||
import os
|
import os
|
||||||
from PIL import Image, ImageTk
|
from PIL import Image, ImageTk
|
||||||
import webbrowser
|
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):
|
class CustomerThinkerApp(ctk.CTk):
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
super().__init__()
|
super().__init__()
|
||||||
|
|
||||||
|
self.iconbitmap(icon_path) # Setzt das Icon
|
||||||
|
|
||||||
self.title("CustomerThinker PDF Export Tool")
|
self.title("CustomerThinker PDF Export Tool")
|
||||||
window_width = 400
|
window_width = 400
|
||||||
window_height = 400
|
window_height = 450
|
||||||
|
|
||||||
# Bildschirmgröße ermitteln
|
# Bildschirmgröße ermitteln
|
||||||
screen_width = self.winfo_screenwidth()
|
screen_width = self.winfo_screenwidth()
|
||||||
|
|
@ -27,7 +48,7 @@ class CustomerThinkerApp(ctk.CTk):
|
||||||
ctk.set_appearance_mode("System") # "Dark", "Light", "System"
|
ctk.set_appearance_mode("System") # "Dark", "Light", "System"
|
||||||
ctk.set_default_color_theme("blue") # Andere Themes: "green", "dark-blue"
|
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.labels_dir = "label"
|
||||||
self.orders_dir = "orders"
|
self.orders_dir = "orders"
|
||||||
|
|
||||||
|
|
@ -67,7 +88,7 @@ class CustomerThinkerApp(ctk.CTk):
|
||||||
self.status_label_logo.pack(pady=10)
|
self.status_label_logo.pack(pady=10)
|
||||||
|
|
||||||
# Logo unten rechts
|
# 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 = ctk.CTkLabel(self, image=self.logo_image, text="", fg_color="transparent")
|
||||||
self.logo_label.bind("<Button-1>", self.open_link) # Klick-Event
|
self.logo_label.bind("<Button-1>", self.open_link) # Klick-Event
|
||||||
self.logo_label.bind("<Enter>", self.on_logo_hover) # Hover-Ereignis (Maus über Logo)
|
self.logo_label.bind("<Enter>", 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
|
# Einmaliges Binden: Position von Logo UND Button aktualisieren
|
||||||
self.bind("<Configure>", self.update_positions)
|
self.bind("<Configure>", self.update_positions)
|
||||||
|
|
||||||
|
|
||||||
def run_reg_check(self):
|
def run_reg_check(self):
|
||||||
script_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), "reg_check.py")
|
show_config_gui(self) # Direkter Aufruf, kein Thread!
|
||||||
subprocess.Popen([sys.executable, script_path])
|
|
||||||
|
|
||||||
def update_positions(self, event=None):
|
def update_positions(self, event=None):
|
||||||
# Logo rechts unten
|
# Logo rechts unten
|
||||||
|
|
@ -102,12 +121,7 @@ class CustomerThinkerApp(ctk.CTk):
|
||||||
def on_logo_leave(self, event=None):
|
def on_logo_leave(self, event=None):
|
||||||
self.logo_label.configure(cursor="") # Setzt den Cursor zurück, wenn die Maus das Logo verlässt
|
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):
|
def load_gif(self):
|
||||||
gif_path = "printer.gif"
|
|
||||||
if not os.path.exists(gif_path):
|
if not os.path.exists(gif_path):
|
||||||
return
|
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))
|
self.run_button.configure(text=f"{selected_file} drucken", command=lambda: self.run_single_file(full_path))
|
||||||
|
|
||||||
def run_script(self):
|
def run_script(self):
|
||||||
|
print("run_script")
|
||||||
self.set_status("Alle Aufträge werden gedruckt...", "blue")
|
self.set_status("Alle Aufträge werden gedruckt...", "blue")
|
||||||
self.start_animation()
|
self.start_animation()
|
||||||
threading.Thread(target=self.execute_script).start()
|
threading.Thread(target=self.execute_script).start()
|
||||||
|
|
@ -162,7 +177,9 @@ class CustomerThinkerApp(ctk.CTk):
|
||||||
|
|
||||||
def execute_script(self):
|
def execute_script(self):
|
||||||
try:
|
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:
|
if result.returncode == 0:
|
||||||
self.set_status("✅ Alle Aufträge wurden gedruckt!", "green")
|
self.set_status("✅ Alle Aufträge wurden gedruckt!", "green")
|
||||||
else:
|
else:
|
||||||
|
|
@ -176,7 +193,7 @@ class CustomerThinkerApp(ctk.CTk):
|
||||||
|
|
||||||
def execute_single_file(self, full_path):
|
def execute_single_file(self, full_path):
|
||||||
try:
|
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:
|
if result.returncode == 0:
|
||||||
filename = os.path.basename(full_path)
|
filename = os.path.basename(full_path)
|
||||||
self.set_status(f"✅ {filename} wurde gedruckt!", "green")
|
self.set_status(f"✅ {filename} wurde gedruckt!", "green")
|
||||||
|
|
@ -210,6 +227,95 @@ class CustomerThinkerApp(ctk.CTk):
|
||||||
def show_error(self, message):
|
def show_error(self, message):
|
||||||
ctk.CTkMessagebox(title="Fehler", message=message, icon="cancel") if hasattr(ctk, "CTkMessagebox") else print(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__":
|
if __name__ == "__main__":
|
||||||
app = CustomerThinkerApp()
|
app = CustomerThinkerApp()
|
||||||
app.mainloop()
|
app.mainloop()
|
||||||
|
|
|
||||||
|
|
@ -7,7 +7,7 @@ import fitz # PyMuPDF
|
||||||
import win32print
|
import win32print
|
||||||
import win32ui
|
import win32ui
|
||||||
from PIL import Image, ImageWin
|
from PIL import Image, ImageWin
|
||||||
import winreg # ← Registry-Zugriff
|
import winreg
|
||||||
os.system("chcp 65001")
|
os.system("chcp 65001")
|
||||||
|
|
||||||
# Registry-Pfad
|
# Registry-Pfad
|
||||||
|
|
|
||||||
Binary file not shown.
|
After Width: | Height: | Size: 264 KiB |
Loading…
Reference in New Issue