Compare commits
15 Commits
fab2c04d07
...
v1.0-gui-s
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
bc67232628 | ||
|
|
acaaba7758 | ||
|
|
ccc764f198 | ||
|
|
aa12d099ae | ||
|
|
ccf6717e92 | ||
|
|
a2ea61e0f3 | ||
|
|
b8d90481bc | ||
|
|
2b4be16317 | ||
|
|
5d76c6b020 | ||
|
|
02dfb69121 | ||
|
|
5b29837120 | ||
|
|
c086cbd8e1 | ||
|
|
1f265c0e3c | ||
|
|
174521cd0e | ||
|
|
18b0e4c254 |
150
gui.py
150
gui.py
@@ -6,6 +6,35 @@ import os
|
|||||||
from queue import Queue
|
from queue import Queue
|
||||||
import subprocess
|
import subprocess
|
||||||
|
|
||||||
|
# Style einmalig konfigurieren (wird beim ersten Import ausgeführt)
|
||||||
|
_style_configured = False
|
||||||
|
|
||||||
|
def create_macos_button(parent, text, command=None, width=None, height=None, padx=10, pady=5, default=False):
|
||||||
|
"""Erstellt einen Button im nativen macOS-Stil (Aqua Theme)"""
|
||||||
|
global _style_configured
|
||||||
|
# Style nur einmal konfigurieren
|
||||||
|
if not _style_configured:
|
||||||
|
style = ttk.Style()
|
||||||
|
# Verwende das native macOS Aqua Theme
|
||||||
|
try:
|
||||||
|
style.theme_use('aqua') # macOS natives Theme
|
||||||
|
except:
|
||||||
|
pass # Falls aqua nicht verfügbar ist, verwende Standard
|
||||||
|
# Konfiguriere Button-Style für natives macOS-Aussehen
|
||||||
|
style.configure('TButton', font=('Helvetica', 13), padding=(10, 6))
|
||||||
|
_style_configured = True
|
||||||
|
|
||||||
|
# Verwende ttk.Button für natives macOS-Aussehen
|
||||||
|
# Das Aqua Theme stellt primäre Buttons automatisch blau dar
|
||||||
|
btn = ttk.Button(parent, text=text, command=command)
|
||||||
|
if width:
|
||||||
|
btn.config(width=width)
|
||||||
|
|
||||||
|
# Auf macOS werden Buttons automatisch im nativen Stil dargestellt
|
||||||
|
# Primäre Buttons erscheinen blau, sekundäre grau
|
||||||
|
|
||||||
|
return btn
|
||||||
|
|
||||||
class SettingsDialog:
|
class SettingsDialog:
|
||||||
def __init__(self, parent, config):
|
def __init__(self, parent, config):
|
||||||
self.config = config
|
self.config = config
|
||||||
@@ -37,8 +66,9 @@ class SettingsDialog:
|
|||||||
|
|
||||||
self.load_config() # Laden der aktuellen Konfiguration
|
self.load_config() # Laden der aktuellen Konfiguration
|
||||||
|
|
||||||
# Speichern-Button
|
# Speichern-Button (macOS-Style) - primärer Button (blau)
|
||||||
Button(self.top, text="Speichern", command=self.save_config).grid(row=4, column=1, pady=10)
|
save_btn = create_macos_button(self.top, text="Speichern", command=self.save_config, width=16, default=True)
|
||||||
|
save_btn.grid(row=4, column=1, pady=12, padx=5)
|
||||||
|
|
||||||
def toggle_password_visibility(self):
|
def toggle_password_visibility(self):
|
||||||
"""Wechselt die Sichtbarkeit des Passworteingabefelds."""
|
"""Wechselt die Sichtbarkeit des Passworteingabefelds."""
|
||||||
@@ -97,8 +127,8 @@ class GUI:
|
|||||||
self.bind_shortcuts()
|
self.bind_shortcuts()
|
||||||
|
|
||||||
# Fenstergröße und -position festlegen
|
# Fenstergröße und -position festlegen
|
||||||
window_width = 350
|
window_width = 420
|
||||||
window_height = 150
|
window_height = 180
|
||||||
screen_width = self.root.winfo_screenwidth()
|
screen_width = self.root.winfo_screenwidth()
|
||||||
screen_height = self.root.winfo_screenheight()
|
screen_height = self.root.winfo_screenheight()
|
||||||
center_x = int(screen_width / 2 - window_width / 2)
|
center_x = int(screen_width / 2 - window_width / 2)
|
||||||
@@ -111,17 +141,18 @@ class GUI:
|
|||||||
|
|
||||||
# Frame für die Buttons am unteren Rand des Fensters
|
# Frame für die Buttons am unteren Rand des Fensters
|
||||||
self.button_frame = tk.Frame(self.root)
|
self.button_frame = tk.Frame(self.root)
|
||||||
self.button_frame.pack(side=tk.BOTTOM, fill=tk.X, pady=10)
|
self.button_frame.pack(side=tk.BOTTOM, fill=tk.X, pady=12)
|
||||||
|
|
||||||
# Durchsuchen Button
|
# Durchsuchen Button (macOS-Style) - primärer Standard-Button (blau)
|
||||||
self.browse_button = tk.Button(self.button_frame, text="Durchsuchen", command=self.browse)
|
self.browse_button = create_macos_button(self.button_frame, text="Durchsuchen", command=self.browse, width=14, default=True)
|
||||||
self.browse_button.pack(side=tk.LEFT, padx=10, expand=True)
|
self.browse_button.pack(side=tk.LEFT, padx=12, expand=True, pady=4)
|
||||||
|
|
||||||
# Schließen Button
|
# Schließen Button (macOS-Style) - sekundärer Button (grau)
|
||||||
self.close_button = tk.Button(self.button_frame, text="Abbruch", command=self.on_app_close)
|
self.close_button = create_macos_button(self.button_frame, text="Abbruch", command=self.on_app_close, width=14)
|
||||||
self.close_button.pack(side=tk.RIGHT, padx=10, expand=True)
|
self.close_button.pack(side=tk.RIGHT, padx=12, expand=True, pady=4)
|
||||||
|
|
||||||
self.hint_label = tk.Label(self.root, text="Bitte wählen Sie den Ordner mit den Bilddaten aus!")
|
# Hinweis-Label mit angepasster Schriftgröße (wie Buttons: 13pt)
|
||||||
|
self.hint_label = tk.Label(self.root, text="Bitte wählen Sie den Ordner mit den Bilddaten aus!", font=('Helvetica', 13))
|
||||||
self.hint_label.pack(pady=5) # Pady hinzugefügt für etwas Abstand nach oben und unten
|
self.hint_label.pack(pady=5) # Pady hinzugefügt für etwas Abstand nach oben und unten
|
||||||
|
|
||||||
self.root.protocol("WM_DELETE_WINDOW", self.on_close)
|
self.root.protocol("WM_DELETE_WINDOW", self.on_close)
|
||||||
@@ -335,8 +366,8 @@ class JaAbbruchDialog(tk.Toplevel):
|
|||||||
self.transfer_folder = transfer_folder
|
self.transfer_folder = transfer_folder
|
||||||
|
|
||||||
self.title(title)
|
self.title(title)
|
||||||
self.geometry("750x480") # Noch größeres Fenster
|
self.geometry("950x520") # Größeres Fenster für bessere Lesbarkeit und passende Proportionen
|
||||||
self.minsize(700, 450) # Minimale Größe setzen
|
self.minsize(900, 500) # Minimale Größe angepasst
|
||||||
|
|
||||||
# Hauptframe für besseres Layout
|
# Hauptframe für besseres Layout
|
||||||
main_frame = tk.Frame(self)
|
main_frame = tk.Frame(self)
|
||||||
@@ -361,7 +392,7 @@ class JaAbbruchDialog(tk.Toplevel):
|
|||||||
tk.Label(expected_inner, text="Erwartete Daten (Tomedo):", font=italic_font,
|
tk.Label(expected_inner, text="Erwartete Daten (Tomedo):", font=italic_font,
|
||||||
bg='#ffffff', fg='#0066cc', anchor="w").pack(pady=(0, 8), fill=tk.X)
|
bg='#ffffff', fg='#0066cc', anchor="w").pack(pady=(0, 8), fill=tk.X)
|
||||||
expected_label = tk.Label(expected_inner, text=message.split('\n\n')[0],
|
expected_label = tk.Label(expected_inner, text=message.split('\n\n')[0],
|
||||||
font=normal_font, justify=tk.LEFT, wraplength=650,
|
font=normal_font, justify=tk.LEFT, wraplength=800,
|
||||||
bg='#ffffff', fg='#000000', anchor="w")
|
bg='#ffffff', fg='#000000', anchor="w")
|
||||||
expected_label.pack(pady=(0, 0), fill=tk.X)
|
expected_label.pack(pady=(0, 0), fill=tk.X)
|
||||||
|
|
||||||
@@ -375,32 +406,35 @@ class JaAbbruchDialog(tk.Toplevel):
|
|||||||
tk.Label(found_inner, text="Gefundene Daten (DICOM):", font=italic_font,
|
tk.Label(found_inner, text="Gefundene Daten (DICOM):", font=italic_font,
|
||||||
bg='#ffffff', fg='#cc6600', anchor="w").pack(pady=(0, 8), fill=tk.X)
|
bg='#ffffff', fg='#cc6600', anchor="w").pack(pady=(0, 8), fill=tk.X)
|
||||||
found_label = tk.Label(found_inner, text=message.split('\n\n')[1],
|
found_label = tk.Label(found_inner, text=message.split('\n\n')[1],
|
||||||
font=normal_font, justify=tk.LEFT, wraplength=650,
|
font=normal_font, justify=tk.LEFT, wraplength=800,
|
||||||
bg='#ffffff', fg='#000000', anchor="w")
|
bg='#ffffff', fg='#000000', anchor="w")
|
||||||
found_label.pack(pady=(0, 0), fill=tk.X)
|
found_label.pack(pady=(0, 0), fill=tk.X)
|
||||||
|
|
||||||
# Frage
|
# Frage
|
||||||
question_label = tk.Label(main_frame,
|
question_label = tk.Label(main_frame,
|
||||||
text="Welche Daten sollen verwendet werden?",
|
text="Welche Daten sollen verwendet werden?",
|
||||||
font=bold_font, wraplength=650)
|
font=bold_font, wraplength=800)
|
||||||
question_label.pack(pady=(0, 25))
|
question_label.pack(pady=(0, 25))
|
||||||
|
|
||||||
# Button-Frame mit besserem Layout - Standard macOS Buttons
|
# Button-Frame mit besserem Layout - Standard macOS Buttons
|
||||||
btn_frame = tk.Frame(main_frame)
|
btn_frame = tk.Frame(main_frame)
|
||||||
btn_frame.pack(pady=15)
|
btn_frame.pack(pady=18)
|
||||||
|
|
||||||
# Standard macOS Buttons (ohne spezielle Farben) - größer
|
# Standard macOS Buttons (ttk.Button für besseres macOS-Aussehen)
|
||||||
yes_btn = tk.Button(btn_frame, text="Tomedo-Daten übernehmen",
|
# Primärer Button (blau) - empfohlene Aktion
|
||||||
command=self.on_yes, width=25, height=2)
|
yes_btn = create_macos_button(btn_frame, text="Tomedo-Daten übernehmen",
|
||||||
yes_btn.pack(side=tk.LEFT, padx=10)
|
command=self.on_yes, width=28, default=True)
|
||||||
|
yes_btn.pack(side=tk.LEFT, padx=10, pady=6)
|
||||||
|
|
||||||
no_btn = tk.Button(btn_frame, text="Original-Daten behalten",
|
# Sekundärer Button (grau)
|
||||||
command=self.on_no, width=25, height=2)
|
no_btn = create_macos_button(btn_frame, text="Original-Daten behalten",
|
||||||
no_btn.pack(side=tk.LEFT, padx=10)
|
command=self.on_no, width=28)
|
||||||
|
no_btn.pack(side=tk.LEFT, padx=10, pady=6)
|
||||||
|
|
||||||
cancel_btn = tk.Button(btn_frame, text="Abbruch",
|
# Sekundärer Button (grau)
|
||||||
command=self.on_cancel, width=18, height=2)
|
cancel_btn = create_macos_button(btn_frame, text="Abbruch",
|
||||||
cancel_btn.pack(side=tk.LEFT, padx=10)
|
command=self.on_cancel, width=20)
|
||||||
|
cancel_btn.pack(side=tk.LEFT, padx=10, pady=6)
|
||||||
|
|
||||||
self.center_window()
|
self.center_window()
|
||||||
|
|
||||||
@@ -472,8 +506,8 @@ class ConfirmKeepOriginalDialog(tk.Toplevel):
|
|||||||
self.transfer_folder = transfer_folder
|
self.transfer_folder = transfer_folder
|
||||||
|
|
||||||
self.title("Bestätigung")
|
self.title("Bestätigung")
|
||||||
self.geometry("750x600") # Größeres Fenster für vollständige Datenanzeige
|
self.geometry("1000x680") # Größeres Fenster für vollständige Datenanzeige und bessere Lesbarkeit
|
||||||
self.minsize(750, 600) # Minimale Größe erhöht
|
self.minsize(950, 650) # Minimale Größe erhöht
|
||||||
|
|
||||||
main_frame = tk.Frame(self)
|
main_frame = tk.Frame(self)
|
||||||
main_frame.pack(fill=tk.BOTH, expand=True, padx=40, pady=30)
|
main_frame.pack(fill=tk.BOTH, expand=True, padx=40, pady=30)
|
||||||
@@ -503,7 +537,7 @@ class ConfirmKeepOriginalDialog(tk.Toplevel):
|
|||||||
tk.Label(tomedo_inner, text="Erwartete Daten (Tomedo):", font=italic_font,
|
tk.Label(tomedo_inner, text="Erwartete Daten (Tomedo):", font=italic_font,
|
||||||
bg='#ffffff', fg='#0066cc', anchor="w").pack(pady=(0, 8), fill=tk.X)
|
bg='#ffffff', fg='#0066cc', anchor="w").pack(pady=(0, 8), fill=tk.X)
|
||||||
tomedo_label = tk.Label(tomedo_inner, text=tomedo_data,
|
tomedo_label = tk.Label(tomedo_inner, text=tomedo_data,
|
||||||
font=normal_font, justify=tk.LEFT, wraplength=650,
|
font=normal_font, justify=tk.LEFT, wraplength=800,
|
||||||
bg='#ffffff', fg='#000000', anchor="w")
|
bg='#ffffff', fg='#000000', anchor="w")
|
||||||
tomedo_label.pack(pady=(0, 0), fill=tk.X)
|
tomedo_label.pack(pady=(0, 0), fill=tk.X)
|
||||||
|
|
||||||
@@ -517,37 +551,40 @@ class ConfirmKeepOriginalDialog(tk.Toplevel):
|
|||||||
tk.Label(original_inner, text="Gefundene Daten (DICOM):", font=italic_font,
|
tk.Label(original_inner, text="Gefundene Daten (DICOM):", font=italic_font,
|
||||||
bg='#ffffff', fg='#cc6600', anchor="w").pack(pady=(0, 8), fill=tk.X)
|
bg='#ffffff', fg='#cc6600', anchor="w").pack(pady=(0, 8), fill=tk.X)
|
||||||
original_label = tk.Label(original_inner, text=original_data,
|
original_label = tk.Label(original_inner, text=original_data,
|
||||||
font=normal_font, justify=tk.LEFT, wraplength=650,
|
font=normal_font, justify=tk.LEFT, wraplength=800,
|
||||||
bg='#ffffff', fg='#000000', anchor="w")
|
bg='#ffffff', fg='#000000', anchor="w")
|
||||||
original_label.pack(pady=(0, 0), fill=tk.X)
|
original_label.pack(pady=(0, 0), fill=tk.X)
|
||||||
|
|
||||||
# Frage
|
# Frage
|
||||||
question_label = tk.Label(main_frame,
|
question_label = tk.Label(main_frame,
|
||||||
text="Sind Sie sicher, dass Sie die Original-Daten behalten möchten?",
|
text="Sind Sie sicher, dass Sie die Original-Daten behalten möchten?",
|
||||||
font=bold_font, wraplength=650, justify=tk.CENTER)
|
font=bold_font, wraplength=800, justify=tk.CENTER)
|
||||||
question_label.pack(pady=(0, 10))
|
question_label.pack(pady=(0, 10))
|
||||||
|
|
||||||
info_label = tk.Label(main_frame,
|
info_label = tk.Label(main_frame,
|
||||||
text="Die Tomedo-Daten sind der Standard und sollten normalerweise verwendet werden.",
|
text="Die Tomedo-Daten sind der Standard und sollten normalerweise verwendet werden.",
|
||||||
font=normal_font, wraplength=650, justify=tk.CENTER, fg='#666666')
|
font=normal_font, wraplength=800, justify=tk.CENTER, fg='#666666')
|
||||||
info_label.pack(pady=(0, 20))
|
info_label.pack(pady=(0, 20))
|
||||||
|
|
||||||
# Button-Frame
|
# Button-Frame
|
||||||
btn_frame = tk.Frame(main_frame)
|
btn_frame = tk.Frame(main_frame)
|
||||||
btn_frame.pack(pady=10)
|
btn_frame.pack(pady=12)
|
||||||
|
|
||||||
# Buttons
|
# Buttons (macOS-Style) - breiter für bessere Textlesbarkeit
|
||||||
tomedo_btn = tk.Button(btn_frame, text="Tomedo-Daten verwenden",
|
# Primärer Button (blau) - empfohlene Aktion
|
||||||
command=self.on_use_tomedo, width=22, height=2)
|
tomedo_btn = create_macos_button(btn_frame, text="Tomedo-Daten verwenden",
|
||||||
tomedo_btn.pack(side=tk.LEFT, padx=8)
|
command=self.on_use_tomedo, width=32, default=True)
|
||||||
|
tomedo_btn.pack(side=tk.LEFT, padx=8, pady=6)
|
||||||
|
|
||||||
keep_btn = tk.Button(btn_frame, text="Original behalten",
|
# Sekundärer Button (grau)
|
||||||
command=self.on_keep_original, width=18, height=2)
|
keep_btn = create_macos_button(btn_frame, text="Original behalten",
|
||||||
keep_btn.pack(side=tk.LEFT, padx=8)
|
command=self.on_keep_original, width=26)
|
||||||
|
keep_btn.pack(side=tk.LEFT, padx=8, pady=6)
|
||||||
|
|
||||||
cancel_btn = tk.Button(btn_frame, text="Abbruch",
|
# Sekundärer Button (grau)
|
||||||
command=self.on_cancel, width=15, height=2)
|
cancel_btn = create_macos_button(btn_frame, text="Abbruch",
|
||||||
cancel_btn.pack(side=tk.LEFT, padx=8)
|
command=self.on_cancel, width=20)
|
||||||
|
cancel_btn.pack(side=tk.LEFT, padx=8, pady=6)
|
||||||
|
|
||||||
self.center_window()
|
self.center_window()
|
||||||
|
|
||||||
@@ -615,20 +652,25 @@ class JaNeinAbbruchDialog(tk.Toplevel):
|
|||||||
|
|
||||||
self.title(title)
|
self.title(title)
|
||||||
|
|
||||||
self.geometry("400x175") # Größe des Dialogs
|
self.geometry("480x190") # Kompakteres Fenster für bessere Lesbarkeit
|
||||||
tk.Label(self, text=self.message).pack(pady=20)
|
self.minsize(450, 170) # Minimale Größe
|
||||||
|
tk.Label(self, text=self.message, font=('Helvetica', 13), wraplength=420).pack(pady=20)
|
||||||
|
|
||||||
btn_frame = tk.Frame(self)
|
btn_frame = tk.Frame(self)
|
||||||
btn_frame.pack(pady=10)
|
btn_frame.pack(pady=12)
|
||||||
|
|
||||||
ja_btn = tk.Button(btn_frame, text="Ja", command=self.on_ja)
|
# Buttons (macOS-Style) - minimale Breiten für bessere Lesbarkeit
|
||||||
ja_btn.pack(side=tk.LEFT, padx=10, pady=20)
|
# Primärer Button (blau) - Ja ist die primäre Aktion
|
||||||
|
ja_btn = create_macos_button(btn_frame, text="Ja", command=self.on_ja, width=8, default=True)
|
||||||
|
ja_btn.pack(side=tk.LEFT, padx=8, pady=5)
|
||||||
|
|
||||||
nein_btn = tk.Button(btn_frame, text="Nein", command=self.on_nein)
|
# Sekundärer Button (grau)
|
||||||
nein_btn.pack(side=tk.LEFT, padx=10, pady=20)
|
nein_btn = create_macos_button(btn_frame, text="Nein", command=self.on_nein, width=8)
|
||||||
|
nein_btn.pack(side=tk.LEFT, padx=8, pady=5)
|
||||||
|
|
||||||
abbruch_btn = tk.Button(btn_frame, text="Abbruch", command=self.on_abbruch)
|
# Sekundärer Button (grau)
|
||||||
abbruch_btn.pack(side=tk.LEFT, padx=10, pady=20)
|
abbruch_btn = create_macos_button(btn_frame, text="Abbruch", command=self.on_abbruch, width=10)
|
||||||
|
abbruch_btn.pack(side=tk.LEFT, padx=8, pady=5)
|
||||||
|
|
||||||
self.center_window()
|
self.center_window()
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user