Untitled
unknown
plain_text
a year ago
7.7 kB
6
Indexable
class SettingsMenu(ctk.CTkFrame):
def __init__(self, parent, dark_mode):
# Fixed dimensions
menu_width = 280 # Fixed width
window_height = parent.winfo_height()
super().__init__(
parent,
fg_color='#1c1c1e' if dark_mode else '#f5f5f7',
width=menu_width,
height=window_height
)
self.parent = parent
self.dark_mode = dark_mode
self.is_open = False
self.animation_running = False
self.current_width = 0
self.target_width = menu_width
# Config file path
self.config_file = "settings.json"
# Add border color based on dark mode
self.border_color = '#2c2c2e' if dark_mode else '#e5e5e7'
self.configure(border_width=2, border_color=self.border_color)
# Place the frame initially off-screen
self.place(relx=1, rely=0, x=menu_width, y=0, anchor='ne', height=window_height)
# Load saved settings
self.load_settings()
# Create settings content
self.create_menu_content()
# Create settings button (rest of the button code remains the same)
try:
is_light_bg = not dark_mode
icon_suffix = "-b" if is_light_bg else "-w"
icon_image = ctk.CTkImage(
light_image=Image.open(f"icons/settings{icon_suffix}.png"),
dark_image=Image.open(f"icons/settings{icon_suffix}.png"),
size=(30, 30)
)
self.settings_button = ctk.CTkButton(
self.parent,
image=icon_image,
text="",
width=30,
height=30,
fg_color="transparent",
hover_color='#2c2c2e' if dark_mode else '#e5e5e7',
command=self.toggle_menu
)
self.settings_button.place(relx=0.97, rely=0.05, anchor='center')
except Exception as e:
print(f"Error loading settings icon: {e}")
self.settings_button = ctk.CTkButton(
self.parent,
text="⚙",
width=30,
height=30,
fg_color="transparent",
hover_color='#2c2c2e' if dark_mode else '#e5e5e7',
command=self.toggle_menu
)
self.settings_button.place(relx=0.97, rely=0.04, anchor='center')
# Bind click event to parent window
self.parent.bind("<Button-1>", self.check_click_location)
def load_settings(self):
try:
with open(self.config_file, 'r') as f:
settings = json.load(f)
self.dark_mode = settings.get('DARK_MODE', False)
self.language = settings.get('LANGUAGE', 'EN')
except FileNotFoundError:
self.dark_mode = False
self.language = 'EN'
self.save_settings()
def save_settings(self):
settings = {
'DARK_MODE': self.dark_mode,
'LANGUAGE': self.language
}
with open(self.config_file, 'w') as f:
json.dump(settings, f)
def create_menu_content(self):
"""Create the content of the settings menu"""
text_color = 'white' if self.dark_mode else 'black'
# Title
title_text = "Einstellungen" if self.language == 'DE' else "Settings"
title = ctk.CTkLabel(
self,
text=title_text,
font=("Dongle", 24, "bold"),
text_color=text_color
)
title.pack(pady=(20, 30), padx=20, anchor='w')
# Settings container
settings_frame = ctk.CTkFrame(
self,
fg_color="transparent",
)
settings_frame.pack(fill='x', padx=20)
# Dark Mode Switch
dark_mode_text = "Dunkler Modus" if self.language == 'DE' else "Dark Mode"
dark_mode_switch = ctk.CTkSwitch(
settings_frame,
text=dark_mode_text,
command=self.toggle_dark_mode,
font=("Dongle", 18),
text_color=text_color,
)
dark_mode_switch.pack(pady=(0, 20), anchor='w')
dark_mode_switch.select() if self.dark_mode else dark_mode_switch.deselect()
# Language Selection
language_text = "Sprache" if self.language == 'DE' else "Language"
language_label = ctk.CTkLabel(
settings_frame,
text=language_text,
font=("Dongle", 18),
text_color=text_color
)
language_label.pack(anchor='w')
language_var = ctk.StringVar(value=self.language)
language_frame = ctk.CTkFrame(settings_frame, fg_color="transparent")
language_frame.pack(fill='x', pady=(5, 20))
# Radio buttons for language selection
de_radio = ctk.CTkRadioButton(
language_frame,
text="Deutsch",
variable=language_var,
value="DE",
command=lambda: self.change_language("DE"),
font=("Dongle", 16),
text_color=text_color
)
de_radio.pack(side='left', padx=(0, 20))
en_radio = ctk.CTkRadioButton(
language_frame,
text="English",
variable=language_var,
value="EN",
command=lambda: self.change_language("EN"),
font=("Dongle", 16),
text_color=text_color
)
en_radio.pack(side='left')
def toggle_dark_mode(self):
self.dark_mode = not self.dark_mode
self.parent.configure(fg_color='#1c1c1e' if self.dark_mode else '#f5f5f7')
self.configure(fg_color='#1c1c1e' if self.dark_mode else '#f5f5f7')
self.border_color = '#2c2c2e' if self.dark_mode else '#e5e5e7'
self.configure(border_color=self.border_color)
# Update appearance mode
ctk.set_appearance_mode("dark" if self.dark_mode else "light")
# Update circles
for circle in self.parent.winfo_children():
if isinstance(circle, CircularProgress):
circle.set_dark_mode(self.dark_mode)
# Save settings
self.save_settings()
# Recreate menu content to update colors
for widget in self.winfo_children():
widget.destroy()
self.create_menu_content()
def change_language(self, new_language):
self.language = new_language
self.parent.LANGUAGE = new_language # Update root's language
# Update circle labels
for circle in self.parent.winfo_children():
if isinstance(circle, CircularProgress):
waste_type = circle.label
# Find the corresponding translation
for de_key, en_value in TRANSLATIONS['EN'].items():
if (en_value == waste_type and new_language == 'DE') or \
(de_key == waste_type and new_language == 'EN'):
circle.label = TRANSLATIONS[new_language][de_key]
circle.draw()
break
# Save settings
self.save_settings()
# Recreate menu content to update text
for widget in self.winfo_children():
widget.destroy()
self.create_menu_content()Editor is loading...
Leave a Comment