tab to space on linux is not something easy to do, I had to launch windows and use notepad++. Anyway, indentation should all be converted to spaces below
#!/usr/bin/env python3 # -*- coding: utf-8 -*- import locale import os import csv from tkinter import messagebox as msg try: from tkinter import * import ttk except: import tkinter as tk #GUI package from tkinter import ttk def fx_BasicListing(): #argx mode = 1 pour basic listing #argx mode = 2 pour adv listing # "txt" pour type enreg csv txt/csv # tree.delete(*tree.get_children()) fx_browseFoldersZ(1) return def fx_AdvancedListing(): #argx mode = 1 pour basic listing #argx mode = 2 pour adv listing # fx_browseFoldersZ(2,"txt") # tree.destroy() #tree.delete(*tree.get_children()) fx_browseFoldersZ(2) return def fx_browseFoldersZ(argy): #argx mode = 1 pour basic listing #argx mode = 2 pour adv listing # "txt" pour type enreg csv txt/csv tree.delete(*tree.get_children()) fx_browseFolders(argy,"txt") ############################################################################### ############################################################################### ############################################################################### def fx_writeCSV(*arr): csv_file_title = 'csv_1_baselisting.csv' # csv path entry box CSV_FILE = vcsv_path.get() if not os.path.exists(CSV_FILE): os.makedirs(CSV_FILE) CSV_FILE += csv_file_title print('%s' % CSV_FILE) with open(CSV_FILE,'w', newline ='\n') as f: write = csv.writer(f, doublequote=True, delimiter=';') for row in arr: write.writerows(row) def fx_writeCSV_str(txt_str): csv_file_title = 'csvtxt_1_baselisting.csv' # csv path entry box CSV_FILE = vcsv_path.get() if not os.path.exists(CSV_FILE): os.makedirs(CSV_FILE) CSV_FILE += csv_file_title print('%s' % CSV_FILE) with open(CSV_FILE,'w') as f: f.write(txt_str) # fx_LoadCSV(CSV_FILE) with open(CSV_FILE, 'r') as f: reader = csv.DictReader(f, delimiter=';') for row in reader: col1 = row['Path'] col2 = row['Folder-file'] col3 = row['Size in Byte'] col4 = row['Size in Kb'] col5 = row['Size in Mb'] col6 = row['Size in Gb'] col7 = row['type'] tree.insert('', 'end', values=(col1, col2, col3, col4, col5, col6,col7)) return ############################################################################### ############################################################################### def fx_chkPath(xzPath): isxFile = os.path.isfile(xzPath) isxDir = os.path.isdir(xzPath) print("DOSSIER OUI????",isxDir) if isxDir: return elif not isxDir: msg.showwarning("Folder path", "WD Path entered not found") return ############################################################################### ############################################################################### ############################################################################### def fx_browseFolders(argz, tycsv): tree.delete(*tree.get_children()) # /// /// /// csv_txt = "" csv_contents = "" counterPath = 0 size = 0 f_size = 0 f_vscale = 0 # /// /// /// # path WD Lpath = vtxt_path.get() print('%s' % Lpath) # include files vvchkboxF = vchkboxF.get() # print("include files:::", vchkboxF.get()) # include modification date print(vchkboxD.get()) # include creation date print(vchkboxC.get()) # scale f_vscale = int(var_scale.get()) print(f_vscale) # path WD 2 if Lpath.endswith(os.path.sep): Lpath = Lpath[:-1] # isFile = os.path.isfile(Lpath) # print("fichier?",isFile) fx_chkPath(Lpath) counterPath = Lpath.count(os.path.sep) csv_contents = "Path;Folder-file;Size in Byte;Size in Kb;Size in Mb;Size in Gb;type\n" csv_txt = csv_contents # csv_contents # 1-FOLDER PATH # 2-FILENAME # 3-FOLDER PATH FULL # 4-Size in Byte # 5-Size in Kb # 6-Size in Mb # 7-Size in Gb # 8-type\n ### BASIC LISTING ######### if argz == 1: print("basic listing") file_paths = [] file_paths.append([csv_contents]) for root, dirs, files in os.walk(Lpath, topdown=True): for file in files: if tycsv == "csv": vfolder_path = root + os.sep vfile_name = "'" + file + "'" vfolder_path_full = root + os.sep + file csv_contents = "%s;%s;%s;%s;%s;%s;%s" % (vfolder_path, vfile_name , 'na', 'na', 'na','na', "folder") file_paths.append([csv_contents]) elif tycsv == "txt": vfolder_path = root + os.sep vfile_name = file vfolder_path_full = root + os.sep + file f_size = os.path.getsize(vfolder_path_full) csv_txt += "%s;%s;%.0f;%.2f;%.2f;%.2f;%s" % (vfolder_path, vfile_name, f_size, f_size/1024, f_size/1048576,f_size/1073741824, "file\n") # APPEL FONCTION ECRIT ARRAY TO CSV if tycsv == "csv": fx_writeCSV(file_paths) elif tycsv == "txt": # APPEL FONCTION ECRIT STR TO CSV fx_writeCSV_str(csv_txt) print("job basic listing ok") ### ADVANCED LISTING ######## elif argz == 2: print("advanced listing") if vvchkboxF == 0: # *** FOLDERS ONLY *** for root, dirs, files in os.walk(Lpath, topdown=False): ### calcul taille dossier f_size = 0 for x, y, z in os.walk(root): for i in z: ftmp_che = x + os.sep + i f_size += os.path.getsize(ftmp_che) ### ecriture taille dossier counter = root.count(os.path.sep) - counterPath vfile_name = root vfile_name = vfile_name + os.path.sep vfile_name = os.path.split(os.path.dirname(vfile_name))[1] vfile_name += os.path.sep if counter <= f_vscale: csv_txt += "%s;%s;%.0f;%.2f;%.2f;%.2f;%s" % (root, vfile_name, f_size, f_size/1024, f_size/1048576,f_size/1073741824, "folder\n") fx_writeCSV_str(csv_txt) print("job adv listing folders ok") elif vvchkboxF == 1: # *** FOLDERS AND FILES ONLY *** for root, dirs, files in os.walk(Lpath, topdown=False): ### calcul taille dossier size = 0 for x, y, z in os.walk(root): for i in z: ftmp_che = x + os.sep + i f_size += os.path.getsize(ftmp_che) ### ecriture taille dossier counter = root.count(os.path.sep) - counterPath vfile_name = root vfile_name = vfile_name + os.path.sep vfile_name = os.path.split(os.path.dirname(vfile_name))[1] vfile_name += os.path.sep if counter <= f_vscale: csv_contents += "%s;%s;%.0f;%.2f;%.2f;%.2f;%s\n" % (root, vfile_name, f_size, f_size/1024, f_size/1048576,f_size/1073741824, "folder") ### calcul +ecriture taille fichier for f in os.listdir(Lpath): path = os.path.join(Lpath, f) if os.path.isfile(path): f_size = 0 f_size = os.path.getsize(path) csv_contents += "%s;%s;%.0f;%.2f;%.2f;%.2f;%s\n" % (path, f, f_size, f_size/1024, f_size/1048576,f_size/1073741824, "file") fx_writeCSV_str(csv_contents) print("job adv listing files ok") return ############################################################################### ############################################################################### ############################################################################### #####################################GUI####################################### ############################################################################### ############################################################################### ############################################################################### locale.setlocale(locale.LC_ALL, "") ## MAIN WINDOW root = Tk() width = int(root.winfo_screenwidth()/1.3) height = int(root.winfo_screenheight()/1.29) positionRight = int(width/7) positionDown = int(height/8) root.geometry('%sx%s+%s+%s' % (width, height, positionRight, positionDown)) root.title("Folders and files tool") ### MAKE TABS tabCtrl = ttk.Notebook(root) tab1 = ttk.Frame(tabCtrl) tab2 = ttk.Frame(tabCtrl) tab3 = ttk.Frame(tabCtrl) tab4 = ttk.Frame(tabCtrl) tabCtrl.add(tab1, text =' Folders mgmt ') tabCtrl.add(tab2, text =' Renamer ') tabCtrl.add(tab3, text =' Something3 ') tabCtrl.add(tab4, text =' More infos ') tabCtrl.pack(expand = 1, fill ="both") ### Display Tabs global vtxt_path global var_scale global vchkboxF global vchkboxD global vchkboxC global vcsv_path #######################///...///...///...///...///####################### # TAB 1 # #######################///...///...///...///...///####################### ### FRAME GLOB frm10 = tk.Frame(tab1, bg="gray5") frm10.pack(expand = 1, fill ="both") # frm10.pack( side = LEFT, expand = True, fill = BOTH) ####################### ### FRAME 11 TOP LABEL frm11 = tk.Frame(frm10, bg="gray5",highlightbackground="HoneyDew3", highlightcolor="HoneyDew3", highlightthickness=1) frm11.place(width=475, height=140, x=20, y=20) # Top label title tk.Label(frm11,text ="Drive or folders", font=("Tahoma", 14, "normal"), fg='gray80', bg='gray5').place(x=20, y=10) ### LABEL PATH entry box tk.Label(frm11, text="Enter Path (WD)", fg='gray80', bg='gray5').place(x=20, y=55) # TEST FOLDER new_text = "/media/ananas/HDD_500B/TEST_APP3/" ### PATH ENTRY BOX vtxt_path=tk.StringVar(root,value=new_text) # Value saved here txt_path = tk.Entry(frm11,width=43, textvariable=vtxt_path, fg='green').place(width=320, height=30, x=140, y=50) # vtxt_path.set(new_text) # TEST FOLDER zzz ### LABEL PATH example tk.Label(frm11, text=r"Ex.: path for Windows: C:\Users\user\Documents\Dossier test", font=("Helvetica", 8, "italic"), fg='gray80', bg='gray5').place(width=320, height=30, x=130, y=80) tk.Label(frm11, text=r" path Linux: /home/user/Documents/Test dossier/", font=("Verdana", 8, "italic"), fg='gray80', bg='gray5').place(width=300, height=30, x=123, y=100) ### frame 11 ########################### ########################### ### FRAME 12 TOP BUTTON SCAN ALL frm12 = tk.Frame(frm10, bg="gray5",highlightbackground="HoneyDew3", highlightcolor="HoneyDew3", highlightthickness=1) frm12.place(width=150, height=40, x=494, y=20) ### button btn_scanALL = tk.Button(frm12, text="Basic listing", bg='lightblue4', font=("Verdana", 10,"normal")) btn_scanALL.pack(expand = 1, fill ="both",padx=0, pady=0) ### BUTTON BROWSE entry fx BASIC LISTING btn_scanALL['command'] = fx_BasicListing ### frame 12 ########################### ########################### ### FRAME 13 TOP BTN SCAN ADV + SLIDER frm13 = tk.Frame(frm10, bg="gray5",highlightbackground="HoneyDew3", highlightcolor="HoneyDew3", highlightthickness=1, bd= 0) frm13.place(width=540, height=100, x=494, y=60) btn_scanADV = tk.Button(frm13, text="Advanced listing", bg='ivory4', font=("Verdana", 10,"normal")) btn_scanADV.place(width=150, height=40, x=0, y=0) ### BUTTON BROWSE entry fx ADVANCED LISTING btn_scanADV['command'] = fx_AdvancedListing ### slider var_scale = tk.DoubleVar() tk.Label(frm13, text="Subfolders level", font=("Verdana", 8, "italic"), fg='gray80', bg='gray5').place(width=150, height=10, x=0, y=46) wslide = tk.Scale(frm13,bg='ivory4', fg='grey5', from_=0, to=10, variable = var_scale, orient=tk.HORIZONTAL) wslide.place(width=150, height=40, x=0, y=58) wslide.set(3) ### frame 13 ########################### ########################### ### FRAME 14 TOP BTN SCAN ADV + CHECKBUTTONS frm14 = tk.Frame(frm10, bg="gray5",highlightbackground="HoneyDew3", highlightcolor="HoneyDew3", highlightthickness=1, bd= 0) frm14.place(width=190, height=100, x=645, y=60) vchkboxF=tk.IntVar() chkbox=tk.Checkbutton(frm14, highlightthickness=0,bd=0,text="Include files", font=("Verdana", 9, "normal"), fg='gray80', bg='gray5', variable=vchkboxF, offvalue=0, onvalue=1) chkbox.place(x=0, y=5) vchkboxD=tk.IntVar() chkbox=tk.Checkbutton(frm14, highlightthickness=0,bd=0,text="Include modification date", font=("Verdana", 9, "normal"), fg='gray80', bg='gray5', variable=vchkboxD, offvalue=0, onvalue=1) chkbox.place(x=0, y=25) vchkboxC=tk.IntVar() chkbox=tk.Checkbutton(frm14, highlightthickness=0,bd=0,text="Include creation date", font=("Verdana", 9, "normal"), fg='gray80', bg='gray5', variable=vchkboxC, offvalue=0, onvalue=1) chkbox.place(x=0, y=45) ### frame 14 ########################### ########################### ### FRAME 15 TREEVIEW frm15 = tk.Frame(frm10, bg="gray5",highlightbackground="HoneyDew3", highlightcolor="HoneyDew3", highlightthickness=1, bd= 0) frm15.place(width=1000, height=350, x=20, y=175) container = ttk.Frame(frm15) # container.place(width=1015, height=350, x=20, y=175) container.pack() style = ttk.Style() style.theme_use("clam") style.configure("Treeview", background="lemonchiffon3",font=('Tahoma', 9), fieldbackground="lemonchiffon3", foreground="grey10") style.configure("Treeview.Heading", font=('Tahoma', 10),foreground='orange4') tree = ttk.Treeview(frm15, columns=('1', '2', '3', '4', '5', '6', '7')) vsb = ttk.Scrollbar(orient="vertical", command=tree.yview) hsb = ttk.Scrollbar(orient="horizontal", command=tree.xview) vsb.place(x=1021, y=231,width=15, height=307,) hsb.place(x=22, y=540,width=1000, height=15,) tree.configure(yscrollcommand=vsb.set, xscrollcommand=hsb.set) container.grid_columnconfigure(0, weight=1) container.grid_rowconfigure(0, weight=1) tree.column('#1', width=180, stretch=YES) tree.column('#2', width=240, stretch=YES) tree.column('#3', width=10, stretch=YES) tree.column('#4', width=5, stretch=YES) tree.column('#5', width=5, stretch=YES) tree.column('#6', width=5, stretch=YES) tree.column('#7', width=25, stretch=YES) tree.heading('#1', text='Path') tree.heading('#2', text='Folder-file') tree.heading('#3', text='Byte') tree.heading('#4', text='Kb') tree.heading('#5', text='Mb') tree.heading('#6', text='Gb') tree.heading('#7', text='Object type') tree['show'] = 'headings' tree.pack(fill=BOTH,expand=1) ### frame 15 ########################### ########################### ### FRAME 16 CSV DIAL frm16 = tk.Frame(frm10, bg="gray5",highlightbackground="HoneyDew3", highlightcolor="HoneyDew3", highlightthickness=1, bd= 0) frm16.place(width=480, height=30, x=20, y=530) # csv lbl tk.Label(frm16,text ="Default folder for csv file (change...)", font=("Verdana", 8, "normal"), fg='gray80', bg='gray5').place(x=10, y=5) # csv folder entry box vcsv_path=tk.StringVar() # Value saved here txt_csv = tk.Entry(frm16,width=43, textvariable=vcsv_path, fg='green').place(width=265, x=210, y=3) full_path = os.path.realpath(__file__) new_text = os.path.dirname(full_path) + os.sep + 'csv_folder' + os.sep vcsv_path.set(new_text) ############################################################################### ############################################################################### ############################################################################### ############################################################################### ############################################################################### ############################################################################### def fx_FileRen(): Lpath = vtxt_path3.get() print('%s' % Lpath) # path WD 2 if Lpath.endswith(os.path.sep): Lpath = Lpath[:-1] print('%s' % Lpath) msg.showwarning("File names", "File names changed") # with open(csv_file_title) as csvfile: # csvreader = csv.reader(csvfile, delimiter=';', quotechar='"') # for row in csvreader: # name = row[0] # new = row[1] # if os.path.exists(name): # os.rename(name, new) # else: # print(name + " does not exist") ############################################################################### def fx_FoldRen(): csv_file_title = 'csv_1_baselisting.csv' print('%s' % csv_file_title) # with open(CSV_FILE,'w', newline ='\n') as f: # write = csv.writer(f, doublequote=True, delimiter=';') # for row in arr: # write.writerows(row) msg.showwarning("Folder names", "Folders names changed") ############################################################################### ############################################################################### ############################################################################### ############################################################################### ############################################################################### ############################################################################### #######################///...///...///...///...///####################### # TAB 2 # #######################///...///...///...///...///####################### ### FRAME GLOB frm20 = tk.Frame(tab2, bg="gray5") frm20.pack(expand = 1, fill ="both") # frm10.pack( side = LEFT, expand = True, fill = BOTH) ####################### ### FRAME 21a FOLDER PATH frm21a = tk.Frame(frm20, bg="gray5",highlightbackground="HoneyDew3", highlightcolor="HoneyDew3", highlightthickness=1) frm21a.place(width=950, height=100, x=20, y=45) # Top label title tk.Label(frm21a,text ="Folder path to list folders files to csv", font=("Tahoma", 14, "normal"), fg='gray80', bg='gray5').place(x=20, y=10) vtxt_path1a=tk.StringVar(root, value=new_text) # Value saved here txt_path1a = tk.Entry(frm21a,width=43, textvariable=vtxt_path1a, fg='blue').place(width=620, height=30, x=140, y=50) ####################### ### FRAME 21 LABEL FILES RENAME frm21 = tk.Frame(frm20, bg="gray5",highlightbackground="HoneyDew3", highlightcolor="HoneyDew3", highlightthickness=1) frm21.place(width=775, height=100, x=20, y=185) # Top label title tk.Label(frm21,text ="Rename files only from csv file below", font=("Tahoma", 14, "normal"), fg='gray80', bg='gray5').place(x=20, y=10) ### LABEL FILES RENAME entry box tk.Label(frm21, text="CSV file path", fg='gray80', bg='gray5').place(x=20, y=55) # TEST FOLDER full_path = os.path.realpath(__file__) new_text = os.path.dirname(full_path) + os.sep + 'csv_folder' + os.sep + "csvtxt_1_filenamelisting.csv" # vtxt_path2.set(new_text) ### PATH ENTRY BOX vtxt_path2=tk.StringVar(root, value=new_text) # Value saved here txt_path2 = tk.Entry(frm21,width=43, textvariable=vtxt_path2, fg='blue').place(width=620, height=30, x=140, y=50) # TEST FOLDER zzz ########################### ### FRAME 22 TOP BUTTON FILE RENAME frm22 = tk.Frame(frm20, bg="gray5",highlightbackground="HoneyDew3", highlightcolor="HoneyDew3", highlightthickness=1) frm22.place(width=150, height=40, x=820, y=220) ### button btn_FileRen = tk.Button(frm22, text="Files rename", bg='lightblue4', font=("Verdana", 10,"normal")) btn_FileRen.pack(expand = 1, fill ="both",padx=0, pady=0) ### BUTTON BROWSE entry fx BASIC LISTING btn_FileRen['command'] = fx_FileRen ####################### ### FRAME 23 LABEL FOLDERS RENAME frm23 = tk.Frame(frm20, bg="gray5",highlightbackground="HoneyDew3", highlightcolor="HoneyDew3", highlightthickness=1) frm23.place(width=775, height=100, x=20, y=320) # Top label title tk.Label(frm23,text ="Rename folders only from csv file below", font=("Tahoma", 14, "normal"), fg='gray80', bg='gray5').place(x=20, y=10) ### LABEL PATH entry box tk.Label(frm23, text="CSV file path", fg='gray80', bg='gray5').place(x=20, y=55) # TEST FOLDER full_path = os.path.realpath(__file__) new_text = os.path.dirname(full_path) + os.sep + 'csv_folder' + os.sep + "csvtxt_1_foldernamelisting.csv" # vtxt_path2.set(new_text) ### PATH ENTRY BOX vtxt_path3=tk.StringVar(root, value=new_text) # Value saved here txt_path3 = tk.Entry(frm23,width=43, textvariable=vtxt_path3, fg='brown').place(width=620, height=30, x=140, y=50) # TEST FOLDER zzz ########################### ### FRAME 24 BUTTON FOLDERS RENAME frm24 = tk.Frame(frm20, bg="gray5",highlightbackground="HoneyDew3", highlightcolor="HoneyDew3", highlightthickness=1) frm24.place(width=150, height=40, x=820, y=345) ### button btn_FoldRen = tk.Button(frm24, text="Folders rename", bg='brown', font=("Verdana", 10,"normal")) btn_FoldRen.pack(expand = 1, fill ="both",padx=0, pady=0) ### BUTTON BROWSE entry fx BASIC LISTING btn_FoldRen['command'] = fx_FoldRen #######################///...///...///...///...///####################### # TAB 3 # #######################///...///...///...///...///####################### #######################///...///...///...///...///####################### # zZZZz # #######################///...///...///...///...///####################### if __name__ == '__main__': root.mainloop() -- https://mail.python.org/mailman/listinfo/python-list