Tuesday, December 11, 2018

codingdirectional: Tell the user how many duplicate files have the python program deleted

Welcome back again, in this chapter we will create a message box to tell the user how many duplicate files have been deleted from each selected file. The game plan here is simple, we will attach a message variable to the label widget and pass that widget to each remove thread instance so the program can modify the content of that message by adding in the selected file name as well as the total number of duplicate files that have been remove from the selected folder. That modify message will then be shown by the messagebox on the main thread at the end of each file deleting process. The first file we need to edit is the main file where we will pass in the tkinter’s label object with the message variable to each new remove thread instance which the program has created, the remove thread instance will then modify the content of that same message which includes the total number of duplicate files that have been deleted together with the file name of the original selected file. We need not worry too much about whether those threads will compete with each other to modify the content of the message or not because one process will finish before another so therefore there is always a time gap in between the process in this case. Here is the new version of the main file.

from tkinter import *
from tkinter import filedialog
from Remove import Remove
import os
from tkinter import messagebox

win = Tk() # 1 Create instance
win.title("Multitas") # 2 Add a title
win.resizable(0, 0) # 3 Disable resizing the GUI
win.configure(background='black') # 4 change background color

# 5 Create a label
aLabel = Label(win, text="Remove duplicate", anchor="center")
aLabel.grid(column=0, row=1)
aLabel.configure(foreground="white")
aLabel.configure(background="black")
aLabel.message = ''

# 6 Create a selectFile function to be used by button
def selectFile():

    fullfilenames = filedialog.askopenfilenames(initialdir="/", title="Select a file") # select multiple files from the hard drive

    if(fullfilenames != ''):

        fullfilenamelist = win.tk.splitlist(fullfilenames)
        directory_path = os.path.dirname(os.path.abspath(fullfilenamelist[0]))

        os.chdir(directory_path)  # change the directory to the selected file directory

        folder = filedialog.askdirectory()  # 7 open a folder then create and start a new remove thread to delete the duplicate file
        folder = folder.replace('/', '\\')  # 8 this is for the windows separator only

        if(folder != '' and folder != os.getcwd()):

            for fullfilename in fullfilenamelist:

                if(fullfilename != ''):
                    filename = fullfilename.split('/')[-1]
                    remove = Remove(folder, filename, fullfilename, directory_path, aLabel)
                    remove.start()
                    remove.join()
                    messagebox.showinfo('Remove duplicate files', aLabel.message)

        else:
            messagebox.showinfo("Error", "Kindly select one folder and it must be a different one")
            return

    else:
        messagebox.showinfo("Select file", "You need to select a file!")
        return


# 9 Adding a Button
action = Button(win, text="Select File", command=selectFile)
action.grid(column=0, row=0)
action.configure(background='brown')
action.configure(foreground='white')

win.mainloop()  # 10 start GUI

And here is the edit version of the remove thread class.

import threading
import os
import filecmp
from tkinter import messagebox

class Remove(threading.Thread):

    def __init__(self, massage,  filename, fullfilename, directory_path, aLabel):

        threading.Thread.__init__(self)
        self.massage = massage
        self.filename, self.file_extension = os.path.splitext(filename)
        self.fullfilename = fullfilename
        self.directory_path = directory_path
        self.count = 0
        self.aLabel = aLabel

    def run(self):

        filepaths = os.listdir(self.massage)

        for filepath in list(filepaths):
            os.chdir(self.massage)
            if(os.getcwd() != self.directory_path): # make sure that we will not delete the same file in the selected file directory
                if(os.path.isfile(filepath)):
                    filename, file_extension = os.path.splitext(filepath)
                    self.remove_file(file_extension, filepath)
                else:
                    self.delete_duplicate(os.path.join(self.massage, filepath))
            else:
                continue

        self.aLabel.message = 'Removed ' + str(self.count) + ' duplicate : ' + self.filename # show this message box each time a set of duplicate files have been remove


    def delete_duplicate(self, folder): # sub method to pass folder to

        filepaths = os.listdir(folder)

        for filepath in list(filepaths):
            os.chdir(folder)
            if(os.getcwd() != self.directory_path):

                if(os.path.isfile(filepath)):
                    filename, file_extension = os.path.splitext(filepath)
                    self.remove_file(file_extension, filepath)
                else:
                    self.delete_duplicate(os.path.join(folder, filepath))

            else:
                continue

    def remove_file(self, file_extension, filepath):
        if (file_extension == self.file_extension):
            if filecmp.cmp(filepath, self.fullfilename, shallow=False):
                os.remove(filepath)
                self.count += 1

Now each remove thread will manage it’s own business so there is no conflict with the count variable and the old message text will be replaced by the new one by the next process which changes it. That is basically it for this remove duplicate project, we just need to do some decorations on the user interface in the next chapter then we are ready to pack it up and use it on our windows’ desktop.



from Planet Python
via read more

No comments:

Post a Comment

TestDriven.io: Working with Static and Media Files in Django

This article looks at how to work with static and media files in a Django project, locally and in production. from Planet Python via read...