Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- from tkinter import *
- from tkinter import ttk
- from pathlib import Path
- from os.path import expanduser
- import os, glob, configparser, pathlib, datetime, mimetypes, subprocess, gzip, zipfile, logging
- def ext_select_left(event): #событие смена маски для левой панели
- t = lstExtLeft.current() #
- used_mask[0] = False #
- if t != 0: #если это не *.*
- used_mask[0] = True #
- tx = extentions0[t] #
- if tx == '*.*': #
- tx = '*' #
- file_mask[0] = tx #
- view_data()
- def ext_select_right(event): #событие смена маски для правой панели
- t = lstExtRight.current() #
- used_mask[1] = False #
- if t != 0: #если это не *.*
- used_mask[1] = True #
- tx = extentions1[t] #
- if tx == '*.*': #
- tx = '*' #
- file_mask[1] = tx #
- view_data() #
- def check_file_name(): #процедурка проверки имени файла или каталога
- pass
- def rename_left(event):
- rename(False)
- def rename_right(event):
- rename(True)
- def rename(side):
- pass
- def open_left(event):
- if multiple_select_mode == True:
- lblInfo.config(text = 'Необходимо выбрать только один объект')
- return
- open_object(False)
- def open_right(event):
- if multiple_select_mode == True:
- lblInfo.config(text = 'Необходимо выбрать только один объект')
- return
- open_object(True)
- def open_object(side): #функция открытия объекта
- global paths, panel_cur_left, panel_cur_right
- if side == False:
- obj_name = panel_listbox_left[panel_cur_left]
- else:
- obj_name = panel_listbox_right[panel_cur_right]
- if obj_name == '[...]': #переход на каталог выше
- return
- obj_name = obj_name.replace('[', '')
- obj_name = obj_name.replace(']', '')
- if side == False:
- obj_fullname = paths[0] + obj_name + os.sep
- used_mask[0] = False
- else:
- obj_fullname = paths[1] + obj_name + os.sep
- used_mask[1] = False
- path = Path(obj_fullname)
- obj_file = path.is_file()
- if obj_file == False:
- if side == False:
- paths[0] = obj_fullname
- panel_cur_left = 0
- else:
- paths[1] = obj_fullname
- panel_cur_right = 0
- view_data()
- else: #если это файл
- if platform == 'linux':
- subprocess.Popen(['see', obj_fullname]) #открываем если это линукс
- if platform[:3] == 'win':
- subprocess.Popen(['start', obj_fullname], shell = True) #открываем если это windows
- def get_directory_objects_count(t):
- t = t.replace('[', '')
- t = t.replace(']', '')
- t = t + os.sep
- t = t + '*'
- t1 = glob.glob(t)
- cnt = len(t1)
- return cnt
- def select_objects_info(): #процедурка работающая при выборе нескольких объектов
- pass
- def view_object_info_right(t): #выбор одного объекта на правой панели
- obj_name = panel_listbox_right[t]
- obj_fullname = paths[1] + obj_name
- path = Path(obj_fullname)
- obj_file = path.is_file()
- if obj_file == True: #если True значит файл если False значит каталог
- obj_lastchange = os.path.getmtime(obj_fullname)
- obj_create = os.path.getctime(obj_fullname)
- tx_last = datetime.datetime.fromtimestamp(obj_lastchange).strftime('%Y-%m-%d %H:%M:%S')
- tx_create = datetime.datetime.fromtimestamp(obj_create).strftime('%Y-%m-%d %H:%M:%S')
- obj_type = mimetypes.guess_type(obj_fullname)
- obj_type = obj_type[0]
- if obj_type == None:
- obj_type = '?'
- obj_size = os.path.getsize(obj_fullname)
- obj_size = str(obj_size)
- else:
- t = paths[1] + obj_name
- tx = get_directory_objects_count(t)
- t1 = pathlib.Path(obj_fullname).suffix
- t2 = t1.split('.')
- t3 = len(t2) - 1
- obj_ext = t2[t3]
- if obj_file == True:
- tr = 'ФАЙЛ: ' + obj_name + ', MIME: ' + obj_type + '\n'
- tr = tr + 'размер (байт): ' + obj_size + ' создан: ' + tx_create + ' изменен: ' + tx_last
- else:
- obj_name = obj_name.replace('[', '')
- obj_name = obj_name.replace(']', '')
- tr = 'КАТАЛОГ: [' + obj_name.upper() + '] файлов и папок в каталоге: ' + str(tx)
- lblInfo.config(text = tr)
- def view_object_info_left(t): #процедурка отображения информации о выбарнном объекте файле или каталоге
- obj_name = panel_listbox_left[t] #имя и путь
- obj_fullname = paths[0] + obj_name
- path = Path(obj_fullname)
- obj_file = path.is_file()
- if obj_file == True: #если True значит файл если False значит каталог
- obj_lastchange = os.path.getmtime(obj_fullname)
- obj_create = os.path.getctime(obj_fullname)
- tx_last = datetime.datetime.fromtimestamp(obj_lastchange).strftime('%Y-%m-%d %H:%M:%S')
- tx_create = datetime.datetime.fromtimestamp(obj_create).strftime('%Y-%m-%d %H:%M:%S')
- obj_type = mimetypes.guess_type(obj_fullname)
- obj_type = obj_type[0]
- if obj_type == None:
- obj_type = '?'
- obj_size = os.path.getsize(obj_fullname)
- obj_size = str(obj_size)
- else:
- t = paths[0] + obj_name
- tx = get_directory_objects_count(t)
- t1 = pathlib.Path(obj_fullname).suffix
- t2 = t1.split('.')
- t3 = len(t2) - 1
- obj_ext = t2[t3]
- if obj_file == True:
- tr = 'ФАЙЛ: ' + obj_name + ', MIME: ' + obj_type + '\n'
- tr = tr + 'размер (байт): ' + obj_size + ' создан: ' + tx_create + ' изменен: ' + tx_last
- else:
- obj_name = obj_name.replace('[', '')
- obj_name = obj_name.replace(']', '')
- tr = 'КАТАЛОГ: [' + obj_name.upper() + '] файлов и папок в каталоге: ' + str(tx)
- lblInfo.config(text = tr)
- def select_left(event): #выбранный элемент из панели
- global cur_panel, panel_cur_left
- cur_panel = False
- t = lstLeftPanel.curselection()
- if len(t) == 1:
- tx = t[0]
- if tx == 0:
- return
- panel_cur_left = tx
- view_object_info_left(tx)
- def select_right(event): #для правой панели
- global cur_panel, panel_cur_right
- cur_panel = True
- t = lstRightPanel.curselection()
- if len(t) == 1:
- tx = t[0]
- if tx == 0:
- return
- panel_cur_right = tx
- view_object_info_right(tx)
- def set_panels_list(): #сложная процедурка формирования списка файлов и каталогов на панели
- global panel_listbox_left, panel_listbox_right
- dirs0 = []
- files0 = []
- dirs1 = []
- files1 = []
- panel_listbox_left = ['[...]'] #спеиальный список
- panel_listbox_right = ['[...]'] #для каталогов
- for tx in listfiles0: #
- tj = os.path.basename(tx) #
- path = Path(tx) #
- if path.is_file() == True: #
- files0.append(tj) #
- if path.is_dir() == True: #
- dirs0.append(tj) #
- for tx in listfiles1: #
- tj = os.path.basename(tx) #
- path = Path(tx) #
- if path.is_file() == True: #
- files1.append(tj) #
- if path.is_dir() == True: #
- dirs1.append(tj) #
- sort_reverse = sort_mode[0] #режим сортировки
- files0 = sorted(files0, reverse = sort_reverse)
- dirs0 = sorted(dirs0, reverse = sort_reverse)
- sort_reverse = sort_mode[1]
- files1 = sorted(files1, reverse = sort_reverse)
- dirs1 = sorted(dirs1, reverse = sort_reverse)
- for tx in dirs0:
- panel_list_left.append(tx)
- tx = '[' + tx + ']'
- panel_listbox_left.append(tx)
- for tx in files0:
- panel_list_left.append(tx)
- panel_listbox_left.append(tx)
- for tx in dirs1:
- panel_list_right.append(tx)
- tx = '[' + tx + ']'
- panel_listbox_right.append(tx)
- for tx in files1:
- panel_list_right.append(tx)
- panel_listbox_right.append(tx)
- lstLeftPanel.delete(0, 'end') #очищаем
- lstRightPanel.delete(0, 'end') #оба листбокса
- i = 0 #
- while i < len(panel_listbox_left): #данные из листбокса
- lstLeftPanel.insert(i, panel_listbox_left[i])
- i = i + 1
- i = 0
- while i < len(panel_listbox_right):
- lstRightPanel.insert(i, panel_listbox_right[i])
- i = i + 1
- def view_data(): #процедурка отображения всех данных
- global extentions0, extentions1
- print (paths)
- get_files_list_left(file_mask[0]) #получение файлов по маске для левой панели
- get_files_list_right(file_mask[1]) #для правой панели
- t1 = get_files_extentions(listfiles0)#список расширений файлов для левой панели
- t2 = get_files_extentions(listfiles1)#список расширений файлов для правой панели
- extentions0 = t1
- extentions1 = t2
- i = 0
- while i < len(t1): #
- t1[i] = '*' + t1[i]
- i = i + 1
- i = 0
- while i < len(t2):
- t2[i] = '*' + t2[i]
- i = i + 1
- set_extentions_list(t1, t2) #
- set_panels_list() #
- def set_extentions_list(t1, t2): #добавление расширений файлов в combobox
- #print (t1, t2) #
- lstExtLeft.delete(0, 'end') #очищаем левый выпадающий список
- lstExtRight.delete(0, 'end') #очищаем правый выпадающий список
- nomask = ['*'] #это в случае если маски выключены
- if used_mask[0] == True:
- lstExtLeft.config(values = nomask) #
- else:
- lstExtLeft.config(values = t1) #устанавливаем значения но только в том случае если маска не выбрана
- if used_mask[1] == True:
- lstExtRight.config(values = nomask)
- else:
- lstExtRight.config(values = t2) #для обеих панелей
- lstExtLeft.current(0) #текущее значение
- lstExtRight.current(0) #для панелей расширений файлов
- def window_rebuild(): #процедурка перестроения окна
- pass
- def window_resize(event): #процедурка которая выполняется при ресайзе окна
- global window_width, window_height #глобальные переменные
- window_width = event.width #новая ширина окна
- window_height = event.height #новая высота окна
- window_rebuild()
- def set_default_values(): #прлоцедурка установка дефолтных значений
- t = expanduser("~") + os.sep #домашний каталог пользователя
- paths.append(t) #добавляем два раза
- paths.append(t) #для каждой панели
- def parse_config(): #процедурка парсит файл конфига если он есть
- pass
- def check_exist_file(file): #процедурка проверяет существует ли заданный файл
- path = Path(file)
- t = path.is_file()
- return t
- def get_files_list_left(mask): #процедурка поиска каталогов и файлов по маске для левой панели
- global listfiles0 #
- listfiles0 = [] #
- t = paths[0] + mask #путь
- listfiles0 = glob.glob(t) #
- def get_files_list_right(mask): #процедурка поиска каталогов и файлов по маске для правой панели
- global listfiles1 #
- listfiles1 = [] #
- t = paths[1] + mask #путь
- listfiles1 = glob.glob(t)
- def get_files_extentions(files_list): #процедурка получения списка разрешений файлов
- cur_file_ext = ['.*'] #
- new_cur_file_ext = []
- for t in files_list: #
- path = Path(t) #
- file_ext = pathlib.Path(path).suffix#
- file_ext = file_ext.lower() #
- pos = file_ext.find('?') #позиция в строке
- if pos != -1: #если найден знак вопроса
- t1 = file_ext.split('?') #разделяем по знаку вопроса
- file_ext = t1[0] #
- if path.is_file() == True and file_ext != '':#если это файл и он с расширением
- cur_file_ext.append(file_ext) #
- i = 0 #
- while i < len(cur_file_ext): #перебор всех
- file_ext = cur_file_ext[i] #
- flag_unique = True #
- j = 0
- while j < len(new_cur_file_ext):#
- tx = new_cur_file_ext[j] #
- if file_ext == tx: #
- flag_unique = False #
- j = j + 1 #
- if flag_unique == True: #
- new_cur_file_ext.append(file_ext) #
- i = i + 1
- return (new_cur_file_ext) #
- if __name__ == "__main__":
- dir_root = os.getcwd() #корневая категория
- file_config = dir_root + os.sep + 'config.ini' #файл конфигурации
- file_log = dir_root + os.sep + 'log.txt' #файл для логгирования действий
- paths = [] #пути для каждой панели отдельно
- file_ext = [] #список расширений файлов
- file_mask = ['*', '*'] #маска поиска файлов в панелях
- used_mask = [False, False] #флаг использования маски по файлам для левой и правой панели
- multiple_select_mode = False #режим мультивыбора
- window_width = 640 #
- window_height = 480 #
- platform = sys.platform #
- inffont = ('serif, 10')
- lblfont = ('serif, 11')
- cur_panel = False #False левая панель, True правая
- cur_object = True #True файл False каталог
- flag_multiselect = False #мультивыбор #
- flag_use_config = check_exist_file(file_config) #False если мы используем файл конфигурации, True если не используем
- if flag_use_config == True:
- parse_config()
- else:
- set_default_values()
- root = Tk()
- root.title('xpym - файловый менеджер') #заголовок
- t = str(window_width) + 'x' + str(window_height) #
- root.geometry(t)
- listfiles0 = [] #список файлов и каталогов
- listfiles1 = [] #
- sort_mode = [False, False] #режим сортировки 0 a-z 1 z-a 2 по дате 3 наоборот по дате
- extentions0 = [] #список всех возможных расширений файлов
- extentions1 = [] #а это для правой панели
- panel_list_left = [] #подготовленный и отсортированный список файлов и каталогов
- panel_list_right = [] #а это для правой панели
- panel_listbox_left = [] #
- panel_listbox_right = [] #
- panel_cur_left = -1 #выбанный элемент
- panel_cur_right = -1 #с обоих панелей
- copyright = '© copyright XoFfiCEr 2022 Ukraine' #
- frmTop = Frame(root, height = 20) #фрейм общий для обоих панелей
- frmTop.pack(side = TOP)
- frmInfo = Frame(root, height = 20)
- frmInfo.pack(anchor = NW)
- lblInfo = Label(frmInfo, text = "", justify = LEFT)
- lblInfo.config(font = inffont, text = copyright)
- lblInfo.pack(side = TOP)
- frmLeft = Frame(root, width = 28)
- frmLeft.pack(side = LEFT, fill = X)
- frmRight = Frame(root, width = 28)
- frmRight.pack(side = LEFT, fill = X)
- frmLeftPanel = Frame(frmLeft)
- frmLeftPanel.pack(side = TOP)
- frmRightPanel = Frame(frmRight)
- frmRightPanel.pack(side = TOP)
- lstExtLeft = ttk.Combobox(frmLeftPanel, width = 8)
- lstExtLeft.config(font = lblfont)
- lstExtLeft.pack(anchor = NW, padx = 3, pady = 1)
- lstExtLeft.bind("<<ComboboxSelected>>", ext_select_left)
- lstExtRight = ttk.Combobox(frmRightPanel, width = 8)
- lstExtRight.config(font = lblfont)
- lstExtRight.pack(anchor = NW, padx = 3, pady = 1)
- lstExtRight.bind("<<ComboboxSelected>>", ext_select_right)
- scrLeftPanel = Scrollbar(frmLeftPanel)
- scrLeftPanel.pack(side = RIGHT, fill = Y)
- lstLeftPanel = Listbox(frmLeftPanel, yscrollcommand = scrLeftPanel.set, width = 32, height = 20, bg = 'lightblue', selectbackground = 'red')
- lstLeftPanel.config(font = lblfont)
- lstLeftPanel.pack(side = TOP, padx = 2, expand = YES)
- lstLeftPanel.bind('<Button-1>', select_left)
- lstLeftPanel.bind('<Up>', select_left)
- lstLeftPanel.bind('<Down>', select_left)
- lstLeftPanel.bind('<Double-1>', open_left)
- lstLeftPanel.bind('<Return>', open_left)
- lstLeftPanel.bind('<F2>', rename_left)
- srcRightPanel = Scrollbar(frmRightPanel)
- srcRightPanel.pack(side = RIGHT, fill = Y)
- lstRightPanel = Listbox(frmRightPanel, yscrollcommand = srcRightPanel.set, width = 32, height = 20, bg = 'lightblue', selectbackground = 'red')
- lstRightPanel.config(font = lblfont)
- lstRightPanel.pack(side = TOP, padx = 2, expand = YES)
- lstRightPanel.bind('<Button-1>', select_right)
- lstRightPanel.bind('<Up>', select_right)
- lstRightPanel.bind('<Down>', select_right)
- lstRightPanel.bind('<Double-1>', open_right)
- lstRightPanel.bind('<Return>', open_right)
- lstLeftPanel.bind('<F2>', rename_right)
- view_data()
- root.mainloop()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement