from typing import List from app.utils_drive import Drive from tkinter import * from tkinter import ttk import platform class App: drives: List[Drive] = [] selected = None drive_tree = None def __init__(self): self.OS_TYPE = platform.system() self.root = Tk() self.root.title("Disk Eraser") self.root.geometry("400x300") self.root.minsize(400, 300) self.__load_menus() self.__init_table() 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) self.root.config(menu=main_menu) bottom_frame = ttk.Frame(borderwidth=1, relief=SOLID, padding=[3, 5]) erase_button = ttk.Button(bottom_frame, text="Стереть диск", command=self.__erase_drive) erase_button.pack(side=RIGHT) bottom_frame.pack(side=BOTTOM, fill=X) 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)) elif self.OS_TYPE == "Linux": from diskinfo import Disk, DiskInfo di = DiskInfo() disks = di.get_disk_list(sorting=True) self.drives = [] for disk in disks: 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())) def __init_table(self): self.__load_drives() # определяем столбцы columns = ("name", "type", "capacity", "serial_num") 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("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.column("#1", stretch=YES, width=150, minwidth=120) self.drive_tree.column("#2", stretch=NO, width=60, minwidth=60) self.drive_tree.column("#3", stretch=NO, width=100, minwidth=100) self.drive_tree.column("#4", stretch=YES, width=150, minwidth=100) # добавляем данные for drive in self.drives: self.drive_tree.insert("", END, values=(drive.name, drive.disk_type, self.__human_size(drive.capacity), drive.serial_num)) self.drive_tree.bind("<>", self.__drive_selected) def __human_size(self, size): units = ['Б', 'КБ', 'МБ', 'ГБ', 'ТБ', 'ПБ'] for unit in units: 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): print(self.selected)