diff --git a/app/__init__.py b/app/__init__.py index 644f7bf..d6d070b 100644 --- a/app/__init__.py +++ b/app/__init__.py @@ -1,6 +1,7 @@ import platform -from tkinter import * from tkinter import ttk +from customtkinter import * +from CTkMenuBar import * from typing import List from app.utils_drive import * @@ -15,9 +16,12 @@ class App: drive_tree = None def __init__(self): + set_default_color_theme("dark-blue") + set_appearance_mode("dark") + self.OS_TYPE = platform.system() - self.root = Tk() + self.root = CTk() self.root.title("Disk Eraser") self.root.geometry("700x300") self.root.minsize(700, 300) @@ -27,33 +31,36 @@ class App: self.root.mainloop() def __load_menus(self): - main_menu = Menu() - - help_menu = Menu(tearoff=0) - help_menu.add_command(label="Содержание") - help_menu.add_separator() - help_menu.add_command(label="О программе") - - main_menu.add_cascade(label="Справка", menu=help_menu) + bg_color = self.root._apply_appearance_mode(ThemeManager.theme["CTkFrame"]["fg_color"]) + + main_menu = CTkMenuBar(self.root, bg_color=bg_color) + + help_menu = main_menu.add_cascade("Справка") + + dropdown1 = CustomDropdownMenu(widget=help_menu) + dropdown1.add_option(option="Содержание") + dropdown1.add_separator() + dropdown1.add_option(option="О программе") + self.root.config(menu=main_menu) - self.bottom_frame = ttk.Frame(borderwidth=1, relief=SOLID, padding=[3, 5]) + self.bottom_frame = CTkFrame(self.root, height=10000) - self.erase_button = ttk.Button( + self.erase_button = CTkButton( self.bottom_frame, text="Стереть диск", command=self.__erase_drive) self.erase_button.pack(side=RIGHT) - update_button = ttk.Button( + update_button = CTkButton( self.bottom_frame, text="Обновить", command=self.__update_drives) update_button.pack(side=RIGHT, padx=5) - self.method_box = ttk.Combobox(master=self.bottom_frame, values=list(erasing_methods.keys()), state="readonly") + self.method_box = CTkComboBox(master=self.bottom_frame, values=list(erasing_methods.keys()), state="readonly") self.method_box.pack(side=RIGHT, padx=6) - method_label = ttk.Label(master=self.bottom_frame, text="Метод: ") + method_label = CTkLabel(master=self.bottom_frame, text="Метод: ") method_label.pack(padx=5, side=RIGHT) - self.bottom_frame.pack(side=BOTTOM, fill=X) + self.bottom_frame.pack(side=BOTTOM, fill=BOTH, padx=5, pady=5) def __update_drives(self): self.drive_tree.delete(*self.drive_tree.get_children()) @@ -84,6 +91,19 @@ class App: def __init_table(self): + ###Treeview Customisation (theme colors are selected) + bg_color = self.root._apply_appearance_mode(ThemeManager.theme["CTkFrame"]["fg_color"]) + text_color = self.root._apply_appearance_mode(ThemeManager.theme["CTkLabel"]["text_color"]) + selected_color = self.root._apply_appearance_mode(ThemeManager.theme["CTkButton"]["fg_color"]) + + treestyle = ttk.Style() + treestyle.theme_use() + treestyle.configure("Treeview", background=bg_color, foreground=text_color, fieldbackground=bg_color, borderwidth=0) + treestyle.map('Treeview', background=[('selected', bg_color)], foreground=[('selected', selected_color)]) + treestyle.configure("Treeview.Heading", background=bg_color, foreground=text_color, fieldbackground=bg_color, borderwidth=0) + treestyle.map('Treeview.Heading', background=[('selected', bg_color)], foreground=[('selected', selected_color)]) + self.root.bind("<>", lambda event: self.root.focus_set()) + # определяем столбцы columns = ("index", "name", "type", "capacity", "serial_num") self.drive_tree = ttk.Treeview( @@ -121,7 +141,7 @@ class App: if self.selected is not None: self.erase_button.configure(state='disabled') thread = None - self.progressbar = ttk.Progressbar(master=self.bottom_frame, orient="horizontal", length=250) + self.progressbar = CTkProgressBar(master=self.bottom_frame, orientation="horizontal", width=250) self.progressbar.pack(side=LEFT, padx=6, pady=6) for drive in self.drives: if drive.index == self.selected[0]: diff --git a/app/utils_drive.py b/app/utils_drive.py index e78d7d2..fc739a5 100644 --- a/app/utils_drive.py +++ b/app/utils_drive.py @@ -53,26 +53,15 @@ class Drive(): self.index = index def erase(self, method, progress=0) -> Thread: - if method == "2 прохода": - method_ = self.__erasing_2 - elif method == "Случайные данные": - method = self.__erasing_random - t = Thread(target=method_, args=(progress,)) + t = Thread(target=self.__erasing, args=(progress,)) t.start() return t - def __erasing_2(self, progress): + def __erasing(self, progress): len_write = 0 + write_size = self.block_size*256 with open(self.path, "wb") as drive: while len_write < self.capacity: # drive.write(b"\x00"*self.block_size) - len_write += self.block_size*64 - progress["value"] = int(len_write/self.capacity * 100) - - def __erasing_2(self, progress): - len_write = 0 - with open(self.path, "wb") as drive: - while len_write < self.capacity: - # drive.write(b"\x00"*self.block_size) - len_write += self.block_size*64 - progress["value"] = int(len_write/self.capacity * 100) + len_write += write_size + progress.set(len_write/self.capacity)