disk_eraser/app/__init__.py

102 lines
3.6 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import platform
from tkinter import *
from tkinter import ttk
from typing import List
from app.utils_drive import Drive
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("<<TreeviewSelect>>", 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)