Advertisement
Guest User

file manager

a guest
Aug 7th, 2022
48
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 16.96 KB | None | 0 0
  1. from tkinter import *
  2. from tkinter import ttk
  3. from pathlib import Path
  4. from os.path import expanduser
  5. import os, glob, configparser, pathlib, datetime, mimetypes, subprocess, gzip, zipfile, logging
  6. def ext_select_left(event):                 #событие смена маски для левой панели
  7.     t = lstExtLeft.current()                #
  8.     used_mask[0] = False                    #
  9.     if t != 0:                              #если это не *.*
  10.         used_mask[0] = True                 #
  11.     tx = extentions0[t]                     #
  12.     if tx == '*.*':                         #
  13.         tx = '*'                            #
  14.     file_mask[0] = tx                       #
  15.     view_data()
  16. def ext_select_right(event):                #событие смена маски для правой панели
  17.     t = lstExtRight.current()               #
  18.     used_mask[1] = False                    #
  19.     if t != 0:                              #если это не *.*
  20.         used_mask[1] = True                 #
  21.     tx = extentions1[t]                     #
  22.     if tx == '*.*':                         #
  23.         tx = '*'                            #
  24.     file_mask[1] = tx                       #
  25.     view_data()                             #
  26. def check_file_name():                      #процедурка проверки имени файла или каталога
  27.     pass
  28. def rename_left(event):
  29.     rename(False)
  30. def rename_right(event):
  31.     rename(True)
  32. def rename(side):
  33.     pass
  34. def open_left(event):
  35.     if multiple_select_mode == True:
  36.         lblInfo.config(text = 'Необходимо выбрать только один объект')
  37.         return
  38.     open_object(False)
  39. def open_right(event):
  40.     if multiple_select_mode == True:
  41.         lblInfo.config(text = 'Необходимо выбрать только один объект')
  42.         return
  43.     open_object(True)
  44. def open_object(side):                                      #функция открытия объекта
  45.     global paths, panel_cur_left, panel_cur_right
  46.     if side == False:
  47.         obj_name = panel_listbox_left[panel_cur_left]  
  48.     else:
  49.         obj_name = panel_listbox_right[panel_cur_right]
  50.     if obj_name == '[...]':                                 #переход на каталог выше
  51.         return
  52.     obj_name = obj_name.replace('[', '')
  53.     obj_name = obj_name.replace(']', '')
  54.     if side == False:
  55.         obj_fullname = paths[0] + obj_name + os.sep
  56.         used_mask[0] = False
  57.     else:
  58.         obj_fullname = paths[1] + obj_name + os.sep
  59.         used_mask[1] = False
  60.     path = Path(obj_fullname)  
  61.     obj_file = path.is_file()
  62.     if obj_file == False:
  63.         if side == False:
  64.             paths[0] = obj_fullname
  65.             panel_cur_left = 0
  66.         else:
  67.             paths[1] = obj_fullname
  68.             panel_cur_right = 0
  69.         view_data()
  70.     else:                                               #если это файл
  71.         if platform == 'linux':
  72.             subprocess.Popen(['see', obj_fullname])     #открываем если это линукс
  73.         if platform[:3] == 'win':
  74.             subprocess.Popen(['start', obj_fullname], shell = True) #открываем если это windows
  75. def get_directory_objects_count(t):
  76.     t = t.replace('[', '')
  77.     t = t.replace(']', '')
  78.     t = t + os.sep
  79.     t = t + '*'
  80.     t1 = glob.glob(t)
  81.     cnt = len(t1)
  82.     return cnt
  83. def select_objects_info():              #процедурка работающая при выборе нескольких объектов
  84.     pass                                   
  85. def view_object_info_right(t):          #выбор одного объекта на правой панели
  86.     obj_name = panel_listbox_right[t]
  87.     obj_fullname = paths[1] + obj_name
  88.     path = Path(obj_fullname)  
  89.     obj_file = path.is_file()
  90.     if obj_file == True:                #если True значит файл если False значит каталог
  91.         obj_lastchange = os.path.getmtime(obj_fullname)
  92.         obj_create = os.path.getctime(obj_fullname)
  93.         tx_last = datetime.datetime.fromtimestamp(obj_lastchange).strftime('%Y-%m-%d %H:%M:%S')
  94.         tx_create = datetime.datetime.fromtimestamp(obj_create).strftime('%Y-%m-%d %H:%M:%S')
  95.         obj_type = mimetypes.guess_type(obj_fullname)
  96.         obj_type = obj_type[0]
  97.         if obj_type == None:
  98.             obj_type = '?'
  99.         obj_size = os.path.getsize(obj_fullname)
  100.         obj_size = str(obj_size)
  101.     else:
  102.         t = paths[1] + obj_name
  103.         tx = get_directory_objects_count(t)
  104.     t1 = pathlib.Path(obj_fullname).suffix
  105.     t2 = t1.split('.')
  106.     t3 = len(t2) - 1
  107.     obj_ext = t2[t3]
  108.     if obj_file == True:
  109.         tr = 'ФАЙЛ: ' + obj_name + ', MIME: ' + obj_type + '\n'
  110.         tr = tr + 'размер (байт): ' + obj_size + ' создан: ' + tx_create + ' изменен: ' + tx_last
  111.     else:
  112.         obj_name = obj_name.replace('[', '')
  113.         obj_name = obj_name.replace(']', '')
  114.         tr = 'КАТАЛОГ: [' + obj_name.upper() + '] файлов и папок в каталоге: '  + str(tx)
  115.     lblInfo.config(text = tr)
  116. def view_object_info_left(t):           #процедурка отображения информации о выбарнном объекте файле или каталоге
  117.     obj_name = panel_listbox_left[t]    #имя и путь
  118.     obj_fullname = paths[0] + obj_name
  119.     path = Path(obj_fullname)  
  120.     obj_file = path.is_file()
  121.     if obj_file == True:                #если True значит файл если False значит каталог
  122.         obj_lastchange = os.path.getmtime(obj_fullname)
  123.         obj_create = os.path.getctime(obj_fullname)
  124.         tx_last = datetime.datetime.fromtimestamp(obj_lastchange).strftime('%Y-%m-%d %H:%M:%S')
  125.         tx_create = datetime.datetime.fromtimestamp(obj_create).strftime('%Y-%m-%d %H:%M:%S')
  126.         obj_type = mimetypes.guess_type(obj_fullname)
  127.         obj_type = obj_type[0]
  128.         if obj_type == None:
  129.             obj_type = '?'
  130.         obj_size = os.path.getsize(obj_fullname)
  131.         obj_size = str(obj_size)
  132.     else:
  133.         t = paths[0] + obj_name
  134.         tx = get_directory_objects_count(t)
  135.     t1 = pathlib.Path(obj_fullname).suffix
  136.     t2 = t1.split('.')
  137.     t3 = len(t2) - 1
  138.     obj_ext = t2[t3]
  139.     if obj_file == True:
  140.         tr = 'ФАЙЛ: ' + obj_name + ', MIME: ' + obj_type + '\n'
  141.         tr = tr + 'размер (байт): ' + obj_size + ' создан: ' + tx_create + ' изменен: ' + tx_last
  142.     else:
  143.         obj_name = obj_name.replace('[', '')
  144.         obj_name = obj_name.replace(']', '')
  145.         tr = 'КАТАЛОГ: [' + obj_name.upper() + '] файлов и папок в каталоге: '  + str(tx)
  146.     lblInfo.config(text = tr)
  147. def select_left(event):                 #выбранный элемент из панели
  148.     global cur_panel, panel_cur_left
  149.     cur_panel = False
  150.     t = lstLeftPanel.curselection()
  151.     if len(t) == 1:
  152.         tx = t[0]
  153.         if tx == 0:
  154.             return
  155.         panel_cur_left = tx
  156.         view_object_info_left(tx)
  157. def select_right(event):                #для правой панели
  158.     global cur_panel, panel_cur_right
  159.     cur_panel = True
  160.     t = lstRightPanel.curselection()
  161.     if len(t) == 1:
  162.         tx = t[0]
  163.         if tx == 0:
  164.             return
  165.         panel_cur_right = tx
  166.         view_object_info_right(tx)
  167. def set_panels_list():                  #сложная процедурка формирования списка файлов и каталогов на панели
  168.     global panel_listbox_left, panel_listbox_right
  169.     dirs0 = []
  170.     files0 = []
  171.     dirs1 = []
  172.     files1 = []
  173.     panel_listbox_left = ['[...]']      #спеиальный список
  174.     panel_listbox_right = ['[...]']     #для каталогов
  175.     for tx in listfiles0:               #
  176.         tj = os.path.basename(tx)       #
  177.         path = Path(tx)                 #
  178.         if path.is_file() == True:      #
  179.             files0.append(tj)           #
  180.         if path.is_dir() == True:       #
  181.             dirs0.append(tj)            #
  182.     for tx in listfiles1:               #
  183.         tj = os.path.basename(tx)       #
  184.         path = Path(tx)                 #
  185.         if path.is_file() == True:      #
  186.             files1.append(tj)           #
  187.         if path.is_dir() == True:       #
  188.             dirs1.append(tj)            #
  189.     sort_reverse = sort_mode[0]         #режим сортировки
  190.     files0 = sorted(files0, reverse = sort_reverse)
  191.     dirs0 = sorted(dirs0, reverse = sort_reverse)
  192.     sort_reverse = sort_mode[1]
  193.     files1 = sorted(files1, reverse = sort_reverse)
  194.     dirs1 = sorted(dirs1, reverse = sort_reverse)
  195.     for tx in dirs0:
  196.         panel_list_left.append(tx)
  197.         tx = '[' + tx + ']'
  198.         panel_listbox_left.append(tx)
  199.     for tx in files0:
  200.         panel_list_left.append(tx)
  201.         panel_listbox_left.append(tx)
  202.     for tx in dirs1:
  203.         panel_list_right.append(tx)
  204.         tx = '[' + tx + ']'
  205.         panel_listbox_right.append(tx)
  206.     for tx in files1:
  207.         panel_list_right.append(tx)
  208.         panel_listbox_right.append(tx)
  209.     lstLeftPanel.delete(0, 'end')       #очищаем
  210.     lstRightPanel.delete(0, 'end')      #оба листбокса
  211.     i = 0                               #
  212.     while i < len(panel_listbox_left)#данные из листбокса
  213.         lstLeftPanel.insert(i, panel_listbox_left[i])
  214.         i = i + 1
  215.     i = 0
  216.     while i < len(panel_listbox_right):
  217.         lstRightPanel.insert(i, panel_listbox_right[i])
  218.         i = i + 1
  219. def view_data():                        #процедурка отображения всех данных
  220.     global extentions0, extentions1
  221.     print (paths)
  222.     get_files_list_left(file_mask[0])   #получение файлов по маске для левой панели
  223.     get_files_list_right(file_mask[1])  #для правой панели
  224.     t1 = get_files_extentions(listfiles0)#список расширений файлов для левой панели
  225.     t2 = get_files_extentions(listfiles1)#список расширений файлов для правой панели
  226.     extentions0 = t1
  227.     extentions1 = t2
  228.     i = 0
  229.     while i < len(t1):                  #
  230.         t1[i] = '*' + t1[i]
  231.         i = i + 1
  232.     i = 0
  233.     while i < len(t2):
  234.         t2[i] = '*' + t2[i]
  235.         i = i + 1
  236.     set_extentions_list(t1, t2)         #
  237.     set_panels_list()                   #
  238. def set_extentions_list(t1, t2):        #добавление расширений файлов в combobox
  239.     #print (t1, t2)                     #
  240.     lstExtLeft.delete(0, 'end')         #очищаем левый выпадающий список
  241.     lstExtRight.delete(0, 'end')        #очищаем правый выпадающий список
  242.     nomask = ['*']                      #это в случае если маски выключены
  243.     if used_mask[0] == True:
  244.         lstExtLeft.config(values = nomask)  #
  245.     else:
  246.         lstExtLeft.config(values = t1)      #устанавливаем значения но только в том случае если маска не выбрана  
  247.     if used_mask[1] == True:
  248.         lstExtRight.config(values = nomask)
  249.     else:  
  250.         lstExtRight.config(values = t2)     #для обеих панелей
  251.     lstExtLeft.current(0)               #текущее значение
  252.     lstExtRight.current(0)              #для панелей расширений файлов
  253. def window_rebuild():                   #процедурка перестроения окна
  254.     pass
  255. def window_resize(event):               #процедурка которая выполняется при ресайзе окна
  256.     global window_width, window_height  #глобальные переменные
  257.     window_width = event.width          #новая ширина окна
  258.     window_height = event.height        #новая высота окна
  259.     window_rebuild()
  260. def set_default_values():               #прлоцедурка установка дефолтных значений
  261.     t = expanduser("~") + os.sep        #домашний каталог пользователя
  262.     paths.append(t)                     #добавляем два раза
  263.     paths.append(t)                     #для каждой панели
  264. def parse_config():                     #процедурка парсит файл конфига если он есть
  265.     pass
  266. def check_exist_file(file):             #процедурка проверяет существует ли заданный файл
  267.     path = Path(file)
  268.     t = path.is_file()
  269.     return t
  270. def get_files_list_left(mask):              #процедурка поиска каталогов и файлов по маске для левой панели
  271.     global listfiles0                       #
  272.     listfiles0 = []                         #
  273.     t = paths[0] + mask                     #путь
  274.     listfiles0 = glob.glob(t)               #
  275. def get_files_list_right(mask):             #процедурка поиска каталогов и файлов по маске для правой панели
  276.     global listfiles1                       #
  277.     listfiles1 = []                         #
  278.     t = paths[1] + mask                     #путь
  279.     listfiles1 = glob.glob(t)
  280. def get_files_extentions(files_list):       #процедурка получения списка разрешений файлов
  281.     cur_file_ext = ['.*']                   #
  282.     new_cur_file_ext = []
  283.     for t in files_list:                    #
  284.         path = Path(t)                      #
  285.         file_ext = pathlib.Path(path).suffix#
  286.         file_ext = file_ext.lower()         #
  287.         pos = file_ext.find('?')            #позиция в строке
  288.         if pos != -1:                       #если найден знак вопроса
  289.             t1 = file_ext.split('?')        #разделяем по знаку вопроса
  290.             file_ext = t1[0]                #
  291.         if path.is_file() == True and file_ext != '':#если это файл и он с расширением
  292.             cur_file_ext.append(file_ext)            #
  293.             i = 0                                    #
  294.             while i < len(cur_file_ext):             #перебор всех
  295.                 file_ext = cur_file_ext[i]           #
  296.                 flag_unique = True                   #
  297.                 j = 0
  298.                 while j < len(new_cur_file_ext):#
  299.                     tx = new_cur_file_ext[j]    #
  300.                     if file_ext == tx:          #
  301.                         flag_unique = False     #
  302.                     j = j + 1                   #
  303.                 if flag_unique == True:         #
  304.                     new_cur_file_ext.append(file_ext)   #
  305.                 i = i + 1
  306.     return (new_cur_file_ext)               #
  307. if __name__ == "__main__":
  308.     dir_root = os.getcwd()                              #корневая категория
  309.     file_config = dir_root + os.sep + 'config.ini'      #файл конфигурации
  310.     file_log = dir_root + os.sep + 'log.txt'            #файл для логгирования действий
  311.     paths = []                                          #пути для каждой панели отдельно
  312.     file_ext = []                                       #список расширений файлов
  313.     file_mask = ['*', '*']                              #маска поиска файлов в панелях
  314.     used_mask = [False, False]                          #флаг использования маски по файлам для левой и правой панели
  315.     multiple_select_mode = False                        #режим мультивыбора   
  316.     window_width = 640                                  #
  317.     window_height = 480                                 #
  318.     platform = sys.platform                             #
  319.     inffont = ('serif, 10')
  320.     lblfont = ('serif, 11')
  321.     cur_panel = False                                   #False левая панель, True правая
  322.     cur_object = True                                   #True файл False каталог
  323.     flag_multiselect = False                            #мультивыбор                         #
  324.     flag_use_config = check_exist_file(file_config)     #False если мы используем файл конфигурации, True если не используем
  325.     if flag_use_config == True:
  326.         parse_config()
  327.     else:
  328.         set_default_values()
  329.     root = Tk()
  330.     root.title('xpym - файловый менеджер')              #заголовок
  331.     t = str(window_width) + 'x' + str(window_height)    #
  332.     root.geometry(t)
  333.     listfiles0 = []                                     #список файлов и каталогов
  334.     listfiles1 = []                                     #
  335.     sort_mode = [False, False]                          #режим сортировки 0 a-z 1 z-a 2 по дате 3 наоборот по дате
  336.     extentions0 = []                                    #список всех возможных расширений файлов
  337.     extentions1 = []                                    #а это для правой панели
  338.     panel_list_left = []                                #подготовленный и отсортированный список файлов и каталогов
  339.     panel_list_right = []                               #а это для правой панели
  340.     panel_listbox_left = []                             #
  341.     panel_listbox_right = []                            #
  342.     panel_cur_left = -1                                 #выбанный элемент
  343.     panel_cur_right = -1                                #с обоих панелей
  344.     copyright = '© copyright XoFfiCEr 2022 Ukraine'        #
  345.     frmTop = Frame(root, height = 20)                   #фрейм общий для обоих панелей
  346.     frmTop.pack(side = TOP)
  347.     frmInfo = Frame(root, height = 20)
  348.     frmInfo.pack(anchor = NW)
  349.     lblInfo = Label(frmInfo, text = "", justify = LEFT)
  350.     lblInfo.config(font = inffont, text = copyright)
  351.     lblInfo.pack(side = TOP)
  352.     frmLeft = Frame(root, width = 28)
  353.     frmLeft.pack(side = LEFT, fill = X)
  354.     frmRight = Frame(root, width = 28)
  355.     frmRight.pack(side = LEFT, fill = X)
  356.     frmLeftPanel = Frame(frmLeft)
  357.     frmLeftPanel.pack(side = TOP)
  358.     frmRightPanel = Frame(frmRight)
  359.     frmRightPanel.pack(side = TOP)
  360.     lstExtLeft = ttk.Combobox(frmLeftPanel, width = 8)
  361.     lstExtLeft.config(font = lblfont)
  362.     lstExtLeft.pack(anchor = NW, padx = 3, pady = 1)
  363.     lstExtLeft.bind("<<ComboboxSelected>>", ext_select_left)
  364.     lstExtRight = ttk.Combobox(frmRightPanel, width = 8)
  365.     lstExtRight.config(font = lblfont)
  366.     lstExtRight.pack(anchor = NW, padx = 3, pady = 1)
  367.     lstExtRight.bind("<<ComboboxSelected>>", ext_select_right)
  368.     scrLeftPanel = Scrollbar(frmLeftPanel)
  369.     scrLeftPanel.pack(side = RIGHT, fill = Y)
  370.     lstLeftPanel = Listbox(frmLeftPanel, yscrollcommand = scrLeftPanel.set, width = 32, height = 20, bg = 'lightblue', selectbackground = 'red')
  371.     lstLeftPanel.config(font = lblfont)
  372.     lstLeftPanel.pack(side = TOP, padx = 2, expand = YES)
  373.     lstLeftPanel.bind('<Button-1>', select_left)
  374.     lstLeftPanel.bind('<Up>', select_left)
  375.     lstLeftPanel.bind('<Down>', select_left)
  376.     lstLeftPanel.bind('<Double-1>', open_left)
  377.     lstLeftPanel.bind('<Return>', open_left)
  378.     lstLeftPanel.bind('<F2>', rename_left)
  379.     srcRightPanel = Scrollbar(frmRightPanel)
  380.     srcRightPanel.pack(side = RIGHT, fill = Y)
  381.     lstRightPanel = Listbox(frmRightPanel, yscrollcommand = srcRightPanel.set, width = 32, height = 20, bg = 'lightblue', selectbackground = 'red')
  382.     lstRightPanel.config(font = lblfont)
  383.     lstRightPanel.pack(side = TOP, padx = 2, expand = YES)
  384.     lstRightPanel.bind('<Button-1>', select_right)
  385.     lstRightPanel.bind('<Up>', select_right)
  386.     lstRightPanel.bind('<Down>', select_right)
  387.     lstRightPanel.bind('<Double-1>', open_right)
  388.     lstRightPanel.bind('<Return>', open_right)
  389.     lstLeftPanel.bind('<F2>', rename_right)
  390.     view_data()
  391.     root.mainloop()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement