[ADD] Added progressbar and sorting in columns
This commit is contained in:
parent
c6b5f40b70
commit
e270f30b1c
@ -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))
|
||||||
@ -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)
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user