[ADD] Added progressbar and sorting in columns

This commit is contained in:
vadzik 2024-02-23 21:51:41 +03:00
parent c6b5f40b70
commit e270f30b1c
3 changed files with 76 additions and 35 deletions

View File

@ -37,21 +37,23 @@ class App:
main_menu.add_cascade(label="Справка", menu=help_menu) main_menu.add_cascade(label="Справка", menu=help_menu)
self.root.config(menu=main_menu) self.root.config(menu=main_menu)
bottom_frame = ttk.Frame(borderwidth=1, relief=SOLID, padding=[3, 5]) self.bottom_frame = ttk.Frame(borderwidth=1, relief=SOLID, padding=[3, 5])
self.erase_button = ttk.Button(bottom_frame, text="Стереть диск", command=self.__erase_drive) self.erase_button = ttk.Button(
self.bottom_frame, text="Стереть диск", command=self.__erase_drive)
self.erase_button.pack(side=RIGHT) self.erase_button.pack(side=RIGHT)
update_button = ttk.Button(bottom_frame, text="Обновить", command=self.__update_drives) update_button = ttk.Button(
self.bottom_frame, text="Обновить", command=self.__update_drives)
update_button.pack(side=RIGHT, padx=5) update_button.pack(side=RIGHT, padx=5)
bottom_frame.pack(side=BOTTOM, fill=X) self.bottom_frame.pack(side=BOTTOM, fill=X)
def __update_drives(self): def __update_drives(self):
self.drive_tree.delete(*self.drive_tree.get_children()) self.drive_tree.delete(*self.drive_tree.get_children())
self.__load_drives() self.__load_drives()
for drive in self.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): def __load_drives(self):
@ -61,7 +63,8 @@ class App:
self.drives = [] self.drives = []
if disks := c.Win32_DiskDrive(): if disks := c.Win32_DiskDrive():
for disk in disks: 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": elif self.OS_TYPE == "Linux":
from diskinfo import Disk, DiskInfo from diskinfo import Disk, DiskInfo
di = DiskInfo() di = DiskInfo()
@ -69,22 +72,23 @@ class App:
self.drives = [] self.drives = []
for disk in disks: for disk in disks:
if "zram" not in disk.get_path(): 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): def __init_table(self):
# определяем столбцы # определяем столбцы
columns = ("index", "name", "type", "capacity", "serial_num") 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.pack(fill=BOTH, expand=1, side=TOP)
# определяем заголовки # определяем заголовки
self.drive_tree.heading("index", text="ID", 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) self.drive_tree.heading("name", text="Имя", anchor=W, command=lambda: self.__sort(1, False))
self.drive_tree.heading("type", text="Тип", anchor=W) self.drive_tree.heading("type", text="Тип", anchor=W, command=lambda: self.__sort(2, False))
self.drive_tree.heading("capacity", text="Объем", anchor=W) self.drive_tree.heading("capacity", text="Объем", anchor=W, command=lambda: self.__sort(3, False))
self.drive_tree.heading("serial_num", text="Серийный номер", anchor=W) 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("#1", stretch=NO, width=60, minwidth=60)
self.drive_tree.column("#2", stretch=YES, width=150, minwidth=120) self.drive_tree.column("#2", stretch=YES, width=150, minwidth=120)
@ -105,9 +109,32 @@ class App:
for selected_item in self.drive_tree.selection(): for selected_item in self.drive_tree.selection():
item = self.drive_tree.item(selected_item) item = self.drive_tree.item(selected_item)
self.selected = item["values"] self.selected = item["values"]
print(self.selected)
def __erase_drive(self): def __erase_drive(self):
self.erase_button.configure(state='disabled') self.erase_button.configure(state='disabled')
print(self.selected) 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') 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))

View File

@ -1,3 +1,6 @@
from threading import *
class Drive(): class Drive():
index: int = None index: int = None
@ -16,7 +19,7 @@ class Drive():
serial_num = None 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.name = name
self.disk_type = disk_type self.disk_type = disk_type
self.path = path self.path = path
@ -26,6 +29,16 @@ class Drive():
self.serial_num = dev_id self.serial_num = dev_id
self.index = index self.index = index
def erase(self): def erase(self, progress=0) -> Thread:
pass 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)

View File

@ -4,5 +4,6 @@ from app import App
def main(): def main():
app = App() app = App()
if __name__ == "__main__": if __name__ == "__main__":
main() main()