learning python building 2nd app, need advices
pascal z
barpasc at yahoo.com
Mon Jan 11 07:05:00 EST 2021
#!/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()
More information about the Python-list
mailing list