mpenn/main.py

284 lines
12 KiB
Python

import customtkinter as Ctk
import platform
from icons.icons import Icons
import scripts.get_sys_info as system_code
from scripts.ClosePopup import ClosePopup
from scripts.settings import Settings
from scripts.Converter import Converter
from scripts.Labeling import Labeling
from scripts.folder_mangement.OpenFolder import OpenFolder
from scripts.folder_mangement.CreateFolder import CreateFolder
from scripts.folder_mangement.SwitchFolder import SwitchFolder
SELECTION_TEXT = "Select your Directory and your Export Directory"
class App(Ctk.CTk):
def __init__(self):
super().__init__()
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)
self.minsize(1000, 750)
self.geometry(f"{system_code.window_width}x{system_code.window_height}")
if platform.system() == "Windows":
icon_path = self.icons.get_icon_path()
self.iconbitmap(icon_path)
self.after(1, self.wm_state, system_code.window_state)
self.back_btn_image = self.icons.get_image("BackButton")
self.title("MPENN")
self.protocol('WM_DELETE_WINDOW', self.close_attempt)
self.settings_frame = Settings(master=self)
self.converter_frame = Converter(master=self)
self.last_frame = None
self.popup = None
self.active_frame = None
self.Switch_folder = None
self.create_folder = None
self.open_folder = None
self.labeling = None
self.current_labeling_frame = None
self.last_opened_labeling_frame = None
self.window_informaton_save = ()
# Top Menu
# Widgets
self.settings_btn = Ctk.CTkButton(self, text="Settings", width=100, command=self.open_settings, font=self.my_font)
image = Ctk.CTkImage(self.back_btn_image, size=(50, 50))
self.back_btn = Ctk.CTkButton(self, text="", image=image,width=50, command=self.go_back, font=self.my_font)
self.window_information = Ctk.CTkLabel(self, text="Choose if you want to convert or label DATA", width=100, font=self.my_font)
# Alignment
self.place_top_menu()
self.show_main_menu()
self.bind("<Escape>", self.go_back)
# Open Main UI initially
def show_main_menu(self):
self.window_information.configure(text="Choose if you want to convert or label DATA")
self.buttons_frame = Ctk.CTkFrame(self)
self.active_frame = self.buttons_frame
# Main Menu
self.convert_btn = Ctk.CTkButton(self.buttons_frame, text="Convert Videos\ninto IMG-Sequences", command=self.open_converter, width=64, font=self.my_font)
self.label_btn = Ctk.CTkButton(self.buttons_frame, text="Label and\n manage Images", command=self.open_current_labeling_ui, width=64,font=self.my_font)
# Main Menu
self.active_frame.place(
relx=0.5, rely=0.52,relwidth=0.95, relheight=0.85, anchor="center"
)
self.convert_btn.place(
relx=0.15,
rely=0.5,
anchor="w",
relwidth=0.3,
relheight=0.1
) # Position the converter button to the left
self.label_btn.place(
relx=0.85,
rely=0.5,
anchor="e",
relwidth=0.3,
relheight=0.1
) # Position the label button to the right
def open_current_labeling_ui(self):
self.active_frame.place_forget()
if self.active_frame != self.buttons_frame:
self.active_frame.disable_keybinding()
if self.current_labeling_frame == None:
self.window_information.configure(text=SELECTION_TEXT)
self.Switch_folder = SwitchFolder(master=self, callback=self.open_labeling)
self.current_labeling_frame = self.Switch_folder
self.current_labeling_frame.place(relx=0.5, rely=0.52,relwidth=0.95, relheight=0.85, anchor="center")
else:
self.current_labeling_frame.place(relx=0.5, rely=0.52,relwidth=0.95, relheight=0.85, anchor="center")
self.current_labeling_frame.enable_keybinding()
self.active_frame = self.current_labeling_frame
self.last_frame = self.buttons_frame
def open_labeling(self, img_paths, output):
self.last_opened_labeling_frame = self.current_labeling_frame
self.last_frame = self.current_labeling_frame
self.current_labeling_frame.place_forget()
self.current_labeling_frame.disable_keybinding()
self.labeling = Labeling(master=self, img_paths=img_paths, output_path=output, callback=self.open_folder_uis, window_information=self.change_window_information)
self.current_labeling_frame = self.labeling
self.active_frame = self.current_labeling_frame
self.place_ui()
def reopen_labeling(self, output):
self.last_opened_labeling_frame = self.current_labeling_frame
self.last_frame = self.current_labeling_frame
self.current_labeling_frame.place_forget()
self.current_labeling_frame.disable_keybinding()
self.labeling.update_active_output_path(output)
self.current_labeling_frame = self.labeling
self.active_frame = self.current_labeling_frame
self.place_ui()
def open_folder_uis(self, output, variant): # variant: 0: CreateFolder 1: OpenFolder 3: SwitchFolder
self.last_opened_labeling_frame = self.current_labeling_frame
self.last_frame = self.current_labeling_frame
self.current_labeling_frame.place_forget()
self.current_labeling_frame.disable_keybinding()
if variant == 0:
self.window_information.configure(text="Create new folder in active directory")
self.create_folder = CreateFolder(master=self,output_path=output, callback=self.reopen_labeling)
self.current_labeling_frame = self.create_folder
self.active_frame = self.current_labeling_frame
elif variant == 1:
self.window_information.configure(text="Select new folder in active directory")
self.open_folder = OpenFolder(master=self, output_path=output, callback=self.reopen_labeling)
self.current_labeling_frame = self.open_folder
self.active_frame = self.current_labeling_frame
else:
self.window_information.configure(text=SELECTION_TEXT)
self.current_labeling_frame = self.Switch_folder
self.active_frame = self.current_labeling_frame
self.place_ui()
def open_settings(self):
if self.active_frame == self.settings_frame:
return
elif self.active_frame == self.buttons_frame:
self.last_frame = self.buttons_frame
elif self.active_frame == self.converter_frame:
self.last_frame = self.converter_frame
elif self.active_frame == self.Switch_folder:
self.last_frame = self.Switch_folder
elif self.active_frame == self.labeling:
self.last_frame = self.labeling
elif self.active_frame == self.create_folder:
self.last_frame = self.create_folder
elif self.active_frame == self.open_folder:
self.last_frame = self.open_folder
self.active_frame.place_forget()
if self.active_frame != self.buttons_frame:
self.active_frame.disable_keybinding()
self.window_information.configure(text="Settings")
self.last_opened_labeling_frame = self.current_labeling_frame
self.active_frame = self.settings_frame
self.place_ui()
def open_converter(self):
self.window_information.configure(text=SELECTION_TEXT)
self.last_frame = self.buttons_frame
self.buttons_frame.place_forget()
self.active_frame = self.converter_frame
self.place_ui()
def go_back(self, event = None):
if self.active_frame == self.buttons_frame:
return
elif self.active_frame == self.settings_frame:
system_code.save_setting_change()
if self.last_frame != self.buttons_frame:
self.active_frame.place_forget()
self.active_frame.disable_keybinding()
self.active_frame = self.last_frame
self.last_frame = None
self.place_ui()
else:
self.active_frame.place_forget()
self.active_frame = self.buttons_frame
self.place_ui()
elif self.active_frame == self.Switch_folder:
self.active_frame.place_forget()
self.active_frame.disable_keybinding()
self.active_frame = self.buttons_frame
self.last_frame = None
self.last_opened_labeling_frame = self.Switch_folder
self.place_ui()
elif self.active_frame == self.converter_frame:
self.active_frame.place_forget()
self.active_frame.disable_keybinding()
self.active_frame = self.buttons_frame
self.last_frame = None
self.place_ui()
elif self.active_frame == self.labeling:
self.active_frame.place_forget()
self.active_frame.disable_keybinding()
self.active_frame = self.buttons_frame
self.last_frame = None
self.last_opened_labeling_frame = self.labeling
self.place_ui()
elif self.should_switch_to_labeling():
self.switch_to_labeling()
def should_switch_to_labeling(self):
return (
(self.open_folder is not None and self.open_folder.winfo_ismapped()) or
(self.create_folder is not None and self.create_folder.winfo_ismapped()) or
(self.Switch_folder is not None and self.Switch_folder.winfo_ismapped() and self.last_opened_labeling_frame == self.labeling)
)
def switch_to_labeling(self):
self.hide_and_prepare_last_labeling()
self.change_window_information(None)
self.active_frame.place_forget()
self.active_frame.disable_keybinding()
self.active_frame = self.labeling
self.place_ui()
def hide_and_prepare_last_labeling(self):
if self.current_labeling_frame:
self.current_labeling_frame.place_forget()
self.current_labeling_frame.disable_keybinding()
self.last_opened_labeling_frame = self.current_labeling_frame
self.current_labeling_frame = self.labeling
def change_window_information(self, value):
if value is not None:
self.window_informaton_save = value
if self.current_labeling_frame == self.labeling:
self.window_information.configure(text=f"{self.window_informaton_save[0]} from {self.window_informaton_save[1]} -> {self.window_informaton_save[2]}")
def place_ui(self):
self.active_frame.place(relx=0.5, rely=0.52,relwidth=0.95, relheight=0.85, anchor="center")
if self.active_frame != self.buttons_frame:
self.active_frame.enable_keybinding()
def close_attempt(self):
if self.settings_frame.winfo_ismapped() or self.converter_frame.winfo_ismapped():
self.popup = ClosePopup(master=self, callback=self.close_program)
else:
system_code.save_windows_information(self.geometry(),self.state())
self.close_program()
def close_program(self):
self.destroy()
def place_top_menu(self):
self.settings_btn.place(
relx=0.015,
y=35,
anchor="w",
relwidth=0.1,
relheight=0.035
)
self.back_btn.place(
relx=0.13,
y=35,
anchor="w",
relwidth=0.035,
relheight=0.035
)
self.window_information.place(
relx=0.5,
y=35,
anchor="center",
relwidth=0.6,
relheight=0.095
)
if __name__ == '__main__':
app = App()
app.mainloop()