From 6e0d551970b389239f158f0f94521dbc8abd001a Mon Sep 17 00:00:00 2001 From: Falko Habel Date: Thu, 4 Apr 2024 13:30:41 +0200 Subject: [PATCH] Removed All Folder Dependencies --- icons/icons.py | 10 +- main.py | 2 +- scripts/ClosePopup.py | 5 +- scripts/Colorpicker.py | 4 +- scripts/Labeling.py | 4 +- scripts/folder_mangement/OpenFolder.py | 8 +- scripts/get_sys_info.py | 68 +++-- scripts/theme.py | 369 +++++++++++++++++++++++++ 8 files changed, 435 insertions(+), 35 deletions(-) create mode 100644 scripts/theme.py diff --git a/icons/icons.py b/icons/icons.py index e996ebc..b94afe3 100644 --- a/icons/icons.py +++ b/icons/icons.py @@ -6,7 +6,8 @@ import base64 class Icons: - def __init__(self) -> None: + def __init__(self, path) -> None: + self.path = path self.image_dict = { "BackButton":b"iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAYAAABccqhmAAAFG2lUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4KPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iWE1QIENvcmUgNS41LjAiPgogPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4KICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIgogICAgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIgogICAgeG1sbnM6ZXhpZj0iaHR0cDovL25zLmFkb2JlLmNvbS9leGlmLzEuMC8iCiAgICB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyIKICAgIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIgogICAgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIKICAgeG1wOkNyZWF0ZURhdGU9IjIwMjQtMDItMDdUMjE6MjI6NDYrMDEwMCIKICAgeG1wOk1vZGlmeURhdGU9IjIwMjQtMDItMDdUMjE6MjY6MDMrMDE6MDAiCiAgIHhtcDpNZXRhZGF0YURhdGU9IjIwMjQtMDItMDdUMjE6MjY6MDMrMDE6MDAiCiAgIHBob3Rvc2hvcDpEYXRlQ3JlYXRlZD0iMjAyNC0wMi0wN1QyMToyMjo0NiswMTAwIgogICBwaG90b3Nob3A6Q29sb3JNb2RlPSIzIgogICBwaG90b3Nob3A6SUNDUHJvZmlsZT0ic1JHQiBJRUM2MTk2Ni0yLjEiCiAgIGV4aWY6UGl4ZWxYRGltZW5zaW9uPSIyNTYiCiAgIGV4aWY6UGl4ZWxZRGlt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", "ColorWheel": b"""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 @@ -43,7 +44,7 @@ class Icons: 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""", } - self.save_base64_as_ico(self.image_dict["Icon"], "data/icon.ico") + self.save_base64_as_ico(self.image_dict["Icon"], self.path + "/icon.ico") def save_base64_as_ico(self, base64_string, file_path): try: @@ -61,12 +62,11 @@ class Icons: pass def get_icon_path(self): - return "data/icon.ico" + return self.path + "/icon.ico" def get_image(self, key): """Converts a base64 encoded string to a PIL image.""" if key not in self.image_dict: - print(f"Key '{key}' not found in image dictionary.") return None base64_image_string = self.image_dict[key] @@ -80,4 +80,4 @@ class Icons: image = Image.open(BytesIO(image_data)) return image except Exception as _: - return None \ No newline at end of file + return None diff --git a/main.py b/main.py index e462404..36c5b0c 100644 --- a/main.py +++ b/main.py @@ -18,8 +18,8 @@ SELECTION_TEXT = "Select your Directory and your Export Directory" class App(Ctk.CTk): def __init__(self): super().__init__() - self.icons = Icons() system_code.load_json_file() + self.icons = Icons(path=system_code.data_path) system_code.set_theme() self.my_font = Ctk.CTkFont(family="Berlin Sans FB", size=22) self.font_entry = Ctk.CTkFont(family="Berlin Sans FB", size=18) diff --git a/scripts/ClosePopup.py b/scripts/ClosePopup.py index bbb3d2f..f212dba 100644 --- a/scripts/ClosePopup.py +++ b/scripts/ClosePopup.py @@ -1,10 +1,13 @@ import customtkinter as Ctk +import scripts.get_sys_info as system_code from icons.icons import Icons + class ClosePopup(Ctk.CTkToplevel): def __init__(self,master, callback, **kwargs, ): super().__init__(master, **kwargs) - self.icons = Icons() + system_code.load_json_file() + self.icons = Icons(path=system_code.data_path) self.my_font = Ctk.CTkFont(family="Berlin Sans FB", size=22) self.geometry("400x300") self.resizable(False, False) diff --git a/scripts/Colorpicker.py b/scripts/Colorpicker.py index fa5bbe6..b78c926 100644 --- a/scripts/Colorpicker.py +++ b/scripts/Colorpicker.py @@ -9,6 +9,7 @@ Original: https://github.com/Akascape/CTkColorPicker/tree/main import customtkinter as Ctk from PIL import Image, ImageTk from icons.icons import Icons +import scripts.get_sys_info as system_code import math @@ -25,7 +26,8 @@ class AskColor(Ctk.CTkToplevel): slider_border: int = 1, **button_kwargs): super().__init__(master, **button_kwargs) - self.icons = Icons() + system_code.load_json_file() + self.icons = Icons(path=system_code.data_path) self.selected_color = None self.title(title) WIDTH = width if width >= 250 else 250 diff --git a/scripts/Labeling.py b/scripts/Labeling.py index 5b29bae..689e28c 100644 --- a/scripts/Labeling.py +++ b/scripts/Labeling.py @@ -10,8 +10,8 @@ import scripts.get_sys_info as system_code class Labeling(Ctk.CTkFrame): def __init__(self,master,img_paths, output_path, callback, window_information, **kwargs): super().__init__(master, **kwargs) - self.icons = Icons() system_code.load_json_file() + self.icons = Icons(path=system_code.data_path) self.data_saver = SaveData() self.my_font = Ctk.CTkFont(family="Berlin Sans FB", size=22) self.image_btn_size = system_code.btn_img_size @@ -56,7 +56,6 @@ class Labeling(Ctk.CTkFrame): s: Switch Folder Return: Save Image """ - print("gettriggered") self.master.bind("", self.delete_current_rectangle, add="+") self.master.bind("", self.skip_time, add="+") self.master.bind("", self.set_data_mode_binding, add="+") @@ -169,7 +168,6 @@ class Labeling(Ctk.CTkFrame): self.data_mode_index = 1 - self.data_mode_index system_code.data_mode = system_code.data_modes[self.data_mode_index] self.choose_mode.set(system_code.data_mode) - print("also triggered") def reset_image(self): self.reset_canvas() diff --git a/scripts/folder_mangement/OpenFolder.py b/scripts/folder_mangement/OpenFolder.py index 28f4235..0060f54 100644 --- a/scripts/folder_mangement/OpenFolder.py +++ b/scripts/folder_mangement/OpenFolder.py @@ -10,16 +10,16 @@ FONT = "Berlin Sans FB" class OpenFolder(Ctk.CTkScrollableFrame): def __init__(self,master,output_path, callback, **kwargs, ): super().__init__(master, **kwargs) - self.icons = Icons() self.my_font = Ctk.CTkFont(family=FONT, size=16) self.warning_font = Ctk.CTkFont(family=FONT, size=20) # the variables needed to get from the upper class - + system_code.load_json_file() + self.icons = Icons(path=system_code.data_path) + self.data_saver = SaveData() self.button_image = Ctk.CTkImage(self.icons.get_image("Folder"), size=(63, 63)) self.output_path = output_path self.callback = callback # Store the callback function - system_code.load_json_file() - self.data_saver = SaveData() + self.folders = self.get_all_folders() self.button_size = (50, 50) # Size width and height self.padding = 10 # Padding around each button diff --git a/scripts/get_sys_info.py b/scripts/get_sys_info.py index ea0b200..dc9614e 100644 --- a/scripts/get_sys_info.py +++ b/scripts/get_sys_info.py @@ -2,24 +2,30 @@ import os import re import customtkinter import json +from scripts.theme import Theme -json_file_path = "./data/program.json" -window_width = None -window_height = None -window_state = None -btn_img_size = None -skipable_frames = None -img_format = None -img_format_options = (".gif", ".jpg", ".png", ".tif") -data_modes = ("Resize", "Labeling") -thread_switcher = ("automatic", "manual") -used_threads = None -thread_detection_mode = None -thread_options = [] -data = {} -data_mode = None -color = None -thickness = None + +def create_folder(folder_name): + """ + Creates a folder in the current directory with the specified folder name. + + Parameters: + folder_name (str): The name of the folder to create. + + Returns: + None + """ + try: + # Construct the path where to create the new folder + new_folder_path = os.path.join(os.getcwd(), folder_name) + + # Create the folder + os.makedirs(new_folder_path, exist_ok=True) + + except Exception as e: + print(f"An error occurred while creating the folder: {e}") + + return new_folder_path def load_json_file(): global data, window_width, window_height, window_state, skipable_frames ,img_format, used_threads, thread_detection_mode, thread_options, btn_img_size, data_mode, color, thickness @@ -143,8 +149,30 @@ def save_img_btn_size(btn_size): def set_theme(): # Get the current working directory - current_dir = os.getcwd() # Create the path to the Json file - theme_path = os.path.join(current_dir, 'data', 'MPENN_theme.json') customtkinter.set_appearance_mode("System") # Modes: system (default), light, dark - customtkinter.set_default_color_theme(theme_path) + customtkinter.set_default_color_theme(theme.get_theme()) + + + +data_path = create_folder("MPENNconfigs") +json_file_path = data_path + "./program.json" +theme = Theme(path=data_path) + + +window_width = None +window_height = None +window_state = None +btn_img_size = None +skipable_frames = None +img_format = None +img_format_options = (".gif", ".jpg", ".png", ".tif") +data_modes = ("Resize", "Labeling") +thread_switcher = ("automatic", "manual") +used_threads = None +thread_detection_mode = None +thread_options = [] +data = {} +data_mode = None +color = None +thickness = None \ No newline at end of file diff --git a/scripts/theme.py b/scripts/theme.py new file mode 100644 index 0000000..ae26b7a --- /dev/null +++ b/scripts/theme.py @@ -0,0 +1,369 @@ +import json + + +class Theme: + def __init__(self, path) -> None: + self.path = path + self.theme_json = { + "CTk": { + "fg_color": [ + "#ebebeb", + "#1d1d1d" + ] + }, + "CTkToplevel": { + "fg_color": [ + "gray92", + "#1d1d1d" + ] + }, + "CTkFrame": { + "corner_radius": 6, + "border_width": 0, + "fg_color": [ + "gray86", + "#292929" + ], + "top_fg_color": [ + "gray81", + "gray20" + ], + "border_color": [ + "gray65", + "gray28" + ] + }, + "CTkButton": { + "corner_radius": 6, + "border_width": 0, + "fg_color": [ + "#5f00c7", + "#5f00c7" + ], + "hover_color": [ + "#7d03ff", + "#7d03ff" + ], + "border_color": [ + "#3E454A", + "#949A9F" + ], + "text_color": [ + "#f7f7f7", + "#f7f7f7" + ], + "text_color_disabled": [ + "gray74", + "gray60" + ] + }, + "CTkLabel": { + "corner_radius": 0, + "fg_color": "transparent", + "text_color": [ + "#313131", + "#f7f7f7" + ] + }, + "CTkEntry": { + "corner_radius": 6, + "border_width": 2, + "fg_color": [ + "#cfcfcf", + "#323232" + ], + "border_color": [ + "#cfcfcf", + "#323232" + ], + "text_color": [ + "#2a2a2a", + "#f7f7f7" + ], + "placeholder_text_color": [ + "gray52", + "gray62" + ] + }, + "CTkCheckBox": { + "corner_radius": 6, + "border_width": 3, + "fg_color": [ + "#5f00c7", + "#5f00c7" + ], + "border_color": [ + "#313131", + "#949A9F" + ], + "hover_color": [ + "#7d03ff", + "#7d03ff" + ], + "checkmark_color": [ + "#DCE4EE", + "gray90" + ], + "text_color": [ + "gray10", + "#DCE4EE" + ], + "text_color_disabled": [ + "gray60", + "gray45" + ] + }, + "CTkSwitch": { + "corner_radius": 1000, + "border_width": 3, + "button_length": 0, + "fg_color": [ + "#939BA2", + "#4A4D50" + ], + "progress_color": [ + "#ab5cff", + "#35006f" + ], + "button_color": [ + "#5f00c7", + "#5f00c7" + ], + "button_hover_color": [ + "#7d03ff", + "#7d03ff" + ], + "text_color": [ + "gray10", + "#DCE4EE" + ], + "text_color_disabled": [ + "gray60", + "gray45" + ] + }, + "CTkRadioButton": { + "corner_radius": 1000, + "border_width_checked": 6, + "border_width_unchecked": 3, + "fg_color": [ + "#5f00c7", + "#5f00c7" + ], + "border_color": [ + "#313131", + "#3f3f3f" + ], + "hover_color": [ + "#7d03ff", + "#7d03ff" + ], + "text_color": [ + "gray10", + "#DCE4EE" + ], + "text_color_disabled": [ + "gray60", + "gray45" + ] + }, + "CTkProgressBar": { + "corner_radius": 1000, + "border_width": 0, + "fg_color": [ + "#ab5cff", + "#35006f" + ], + "progress_color": [ + "#5f00c7", + "#5f00c7" + ], + "border_color": [ + "gray", + "gray" + ] + }, + "CTkSlider": { + "corner_radius": 1000, + "button_corner_radius": 1000, + "border_width": 6, + "button_length": 0, + "fg_color": [ + "#ab5cff", + "#35006f" + ], + "progress_color": [ + "#5f00c7", + "#5f00c7" + ], + "button_color": [ + "#5f00c7", + "#5f00c7" + ], + "button_hover_color": [ + "#7d03ff", + "#7d03ff" + ] + }, + "CTkOptionMenu": { + "corner_radius": 6, + "fg_color": [ + "#ab5cff", + "#35006f" + ], + "button_color": [ + "#5f00c7", + "#5f00c7" + ], + "button_hover_color": [ + "#7d03ff", + "#7d03ff" + ], + "text_color": [ + "#DCE4EE", + "#DCE4EE" + ], + "text_color_disabled": [ + "gray74", + "gray60" + ] + }, + "CTkComboBox": { + "corner_radius": 6, + "border_width": 2, + "fg_color": [ + "#ab5cff", + "#35006f" + ], + "border_color": [ + "#5f00c7", + "#5f00c7" + ], + "button_color": [ + "#5f00c7", + "#5f00c7" + ], + "button_hover_color": [ + "#7d03ff", + "#7d03ff" + ], + "text_color": [ + "#f7f7f7", + "#DCE4EE" + ], + "text_color_disabled": [ + "gray50", + "gray45" + ] + }, + "CTkScrollbar": { + "corner_radius": 1000, + "border_spacing": 4, + "fg_color": "transparent", + "button_color": [ + "#cecece", + "#636363" + ], + "button_hover_color": [ + "gray40", + "gray53" + ] + }, + "CTkSegmentedButton": { + "corner_radius": 6, + "border_width": 2, + "fg_color": [ + "#ab5cff", + "#35006f" + ], + "selected_color": [ + "#5f00c7", + "#5f00c7" + ], + "selected_hover_color": [ + "#7d03ff", + "#7d03ff" + ], + "unselected_color": [ + "#ab5cff", + "#35006f" + ], + "unselected_hover_color": [ + "#7d03ff", + "#7d03ff" + ], + "text_color": [ + "#DCE4EE", + "#DCE4EE" + ], + "text_color_disabled": [ + "gray74", + "gray60" + ] + }, + "CTkTextbox": { + "corner_radius": 6, + "border_width": 0, + "fg_color": [ + "#dbdbdb", + "#2a2a2a" + ], + "border_color": [ + "#979DA2", + "#565B5E" + ], + "text_color": [ + "gray10", + "#DCE4EE" + ], + "scrollbar_button_color": [ + "gray55", + "gray41" + ], + "scrollbar_button_hover_color": [ + "gray40", + "gray53" + ] + }, + "CTkScrollableFrame": { + "label_fg_color": [ + "gray78", + "gray23" + ] + }, + "DropdownMenu": { + "fg_color": [ + "gray90", + "gray20" + ], + "hover_color": [ + "gray75", + "gray28" + ], + "text_color": [ + "gray10", + "gray90" + ] + }, + "CTkFont": { + "macOS": { + "family": "SF Display", + "size": 13, + "weight": "normal" + }, + "Windows": { + "family": "Roboto", + "size": 13, + "weight": "normal" + }, + "Linux": { + "family": "Roboto", + "size": 13, + "weight": "normal" + } + } + } + def get_theme(self): + with open(self.path + "/theme.json", "w") as file: + json.dump(self.theme_json, file, indent=4) + return self.path + "/theme.json"