diff --git a/app/__init__.py b/app/__init__.py index 9ce8168..83d94d9 100644 --- a/app/__init__.py +++ b/app/__init__.py @@ -37,31 +37,34 @@ class App: main_menu.add_cascade(label="Справка", menu=help_menu) self.root.config(menu=main_menu) - bottom_frame = ttk.Frame(borderwidth=1, relief=SOLID, padding=[3, 5]) - self.erase_button = ttk.Button(bottom_frame, text="Стереть диск", command=self.__erase_drive) + self.bottom_frame = ttk.Frame(borderwidth=1, relief=SOLID, padding=[3, 5]) + self.erase_button = ttk.Button( + self.bottom_frame, text="Стереть диск", command=self.__erase_drive) self.erase_button.pack(side=RIGHT) - - update_button = ttk.Button(bottom_frame, text="Обновить", command=self.__update_drives) - update_button.pack(side=RIGHT, padx=5) - - bottom_frame.pack(side=BOTTOM, fill=X) - + update_button = ttk.Button( + self.bottom_frame, text="Обновить", command=self.__update_drives) + update_button.pack(side=RIGHT, padx=5) + + self.bottom_frame.pack(side=BOTTOM, fill=X) + def __update_drives(self): self.drive_tree.delete(*self.drive_tree.get_children()) self.__load_drives() for drive in self.drives: - self.drive_tree.insert("", END, values=(drive.index, drive.name, drive.disk_type, self.__human_size(drive.capacity), drive.serial_num)) - + self.drive_tree.insert("", END, values=( + drive.index, drive.name, drive.disk_type, self.__human_size(drive.capacity), drive.serial_num)) + def __load_drives(self): - + if self.OS_TYPE == "Windows": import wmi c = wmi.WMI() self.drives = [] if disks := c.Win32_DiskDrive(): for disk in disks: - self.drives.append(Drive(disk.Model, disk.Name, disk.InterfaceType, disk.DefaultBlockSize, int(disk.Size), disk.SerialNumber, disk.Index)) + self.drives.append(Drive(disk.Model, disk.Name, disk.InterfaceType, disk.DefaultBlockSize, int( + disk.Size), disk.SerialNumber, disk.Index)) elif self.OS_TYPE == "Linux": from diskinfo import Disk, DiskInfo di = DiskInfo() @@ -69,23 +72,24 @@ class App: self.drives = [] for disk in disks: if "zram" not in disk.get_path(): - self.drives.append(Drive(disk.get_model(), disk.get_path(), disk.get_type_str(), disk.get_logical_block_size(), int(disk.get_size()*512), disk.get_serial_number(), disk.get_device_id())) + self.drives.append(Drive(disk.get_model(), disk.get_path(), disk.get_type_str( + ), disk.get_logical_block_size(), int(disk.get_size()*512), disk.get_serial_number(), disk.get_device_id())) def __init_table(self): # определяем столбцы columns = ("index", "name", "type", "capacity", "serial_num") - self.drive_tree = ttk.Treeview(columns=columns, show="headings", selectmode="browse") + self.drive_tree = ttk.Treeview( + columns=columns, show="headings", selectmode="browse") self.drive_tree.pack(fill=BOTH, expand=1, side=TOP) # определяем заголовки - self.drive_tree.heading("index", text="ID", anchor=W) - self.drive_tree.heading("name", text="Имя", anchor=W) - self.drive_tree.heading("type", text="Тип", anchor=W) - self.drive_tree.heading("capacity", text="Объем", anchor=W) - self.drive_tree.heading("serial_num", text="Серийный номер", anchor=W) + self.drive_tree.heading("index", text="ID", anchor=W, command=lambda: self.__sort(0, False)) + self.drive_tree.heading("name", text="Имя", anchor=W, command=lambda: self.__sort(1, False)) + self.drive_tree.heading("type", text="Тип", anchor=W, command=lambda: self.__sort(2, False)) + self.drive_tree.heading("capacity", text="Объем", anchor=W, command=lambda: self.__sort(3, False)) + self.drive_tree.heading("serial_num", text="Серийный номер", anchor=W, command=lambda: self.__sort(4, False)) - self.drive_tree.column("#1", stretch=NO, width=60, minwidth=60) self.drive_tree.column("#2", stretch=YES, width=150, minwidth=120) self.drive_tree.column("#3", stretch=NO, width=100, minwidth=100) @@ -100,14 +104,37 @@ class App: if size < 1024: return f"{size:.1f} {unit}" size /= 1024 - + def __drive_selected(self, event): for selected_item in self.drive_tree.selection(): item = self.drive_tree.item(selected_item) self.selected = item["values"] - print(self.selected) - + def __erase_drive(self): self.erase_button.configure(state='disabled') - print(self.selected) - self.erase_button.configure(state='active') \ No newline at end of file + thread = None + self.progressbar = ttk.Progressbar(master=self.bottom_frame, orient="horizontal", length=280) + self.progressbar.pack(side=LEFT, padx=6, pady=6) + for drive in self.drives: + if drive.index == self.selected[0]: + thread = drive.erase(self.progressbar) + self.__check_thread(thread) + + def __check_thread(self, thread): + if thread.is_alive(): + self.root.after(1000, lambda: self.__check_thread(thread)) + else: + self.progressbar.pack_forget() + self.erase_button.configure(state='active') + + + def __sort(self, col, reverse): + # получаем все значения столбцов в виде отдельного списка + l = [(self.drive_tree.set(k, col), k) for k in self.drive_tree.get_children("")] + # сортируем список + l.sort(reverse=reverse) + # переупорядочиваем значения в отсортированном порядке + for index, (_, k) in enumerate(l): + self.drive_tree.move(k, "", index) + # в следующий раз выполняем сортировку в обратном порядке + self.drive_tree.heading(col, command=lambda: self.__sort(col, not reverse)) \ No newline at end of file diff --git a/app/utils_drive.py b/app/utils_drive.py index d43b3d1..46aa010 100644 --- a/app/utils_drive.py +++ b/app/utils_drive.py @@ -1,22 +1,25 @@ +from threading import * + + class Drive(): - + index: int = None - + path: str total_sectors: str disk_type = None - name: str + name: str - block_size: int = 512 + block_size: int = 512 capacity: int serial_num = None - - def __init__(self, name , path, disk_type, block_size, capacity, dev_id, index): + + def __init__(self, name, path, disk_type, block_size, capacity, dev_id, index): self.name = name self.disk_type = disk_type self.path = path @@ -26,6 +29,16 @@ class Drive(): self.serial_num = dev_id self.index = index - def erase(self): - pass - + def erase(self, progress=0) -> Thread: + t = Thread(target=self.__erasing, args=(progress,)) + t.start() + return t + + def __erasing(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) + diff --git a/main.py b/main.py index b1c9d1d..e80c3d6 100644 --- a/main.py +++ b/main.py @@ -4,5 +4,6 @@ from app import App def main(): app = App() + if __name__ == "__main__": - main() \ No newline at end of file + main()