Skip to content
This repository has been archived by the owner on Feb 15, 2023. It is now read-only.

Commit

Permalink
Rename Utility & Logger
Browse files Browse the repository at this point in the history
Removed print statements
utilities tab
updated progressbar dialog with a logger
  • Loading branch information
natecraddock committed Sep 16, 2018
1 parent 25b8660 commit e01431c
Showing 1 changed file with 130 additions and 9 deletions.
139 changes: 130 additions & 9 deletions page_zipper.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
from tkinter import ttk
from tkinter import filedialog
from tkinter import messagebox
from tkinter.font import Font

from PIL import Image

Expand All @@ -13,6 +14,7 @@
import shutil
import itertools
import webbrowser
import tempfile

class Page:
'''A page object that contains the path to an image file, and the loaded thumbnail of that file'''
Expand Down Expand Up @@ -45,16 +47,27 @@ def __init__(self, pages):
self.pages = pages
self.name = "Group"

# TODO:

class ProgressPopup(tk.Toplevel):
'''Displays progress with progressbar'''
def __init__(self, title, steps=100):
tk.Toplevel.__init__(self)
self.fixed_font = Font(size=10)
self.line_height = self.fixed_font.metrics("linespace")

self.title(title)
tk.Label(self, text=title).grid(row=0, column=0, sticky='w', padx=10, pady=20)
tk.Label(self, text=title).grid(row=0, column=0, sticky='w', padx=5, pady=20, columnspan=2)
self.progress = ttk.Progressbar(self, orient='horizontal', length=200, mode='determinate', maximum=100)
self.progress.grid(row=1, column=0, sticky='ew', padx=5)
self.progress.grid(row=1, column=0, sticky='ew', padx=5, columnspan=2)

self.scrollbar = tk.Scrollbar(self)
self.scrollbar.grid(row=2, column=1, sticky='nesw', pady=10)

self.log = tk.Canvas(self, background='#FFFFFF', width=500, height=150, yscrollcommand=self.scrollbar.set)
self.log.grid(row=2, column=0, sticky='nesw', pady=10)
self.log.line_number = 0

self.scrollbar.config(command=self.log.yview)

self.grab_set()

Expand All @@ -64,6 +77,104 @@ def next(self):
self.progress['value'] += self.step
self.update()

def log_message(self, line):
self.log.create_text(0, (self.line_height * self.log.line_number), font=self.fixed_font, text=line, anchor='nw')
self.log.line_number += 1
self.log.configure(scrollregion=self.log.bbox('all'))
self.log.yview_moveto(1)

self.update()

class RenameFrame(tk.Frame):
def __init__(self, parent):
tk.Frame.__init__(self, parent)

self.number = tk.IntVar()
self.number.set(1)

self.browser = DirectoryBrowser(self, "Rename files in folder:")
self.browser.grid(row=0, column=0, sticky='nesw', padx=5, columnspan=2)

tk.Label(self, text="Starting Number:").grid(column=0, row=1, sticky='nsw')
tk.Entry(self, textvariable=self.number).grid(column=1, row=1, sticky='nsew', padx=5, pady=5)

self.rename_button = tk.Button(self, text='Rename Files', command=self.rename)
self.rename_button.grid(row=2, column=0, columnspan=2, sticky='nesw', padx=5)

def rename(self):
f = self.browser.path.get()
n = self.number.get()

if os.path.exists(f) and len(os.listdir(f)) > 0:
self.rename_files(f, n)

# Renames files (numerically) in "files_in" with base path
def rename_files(self, path, n):
files_in = os.listdir(path)
p = path
count = n
files = files_in[:]
files.sort()

progress = ProgressPopup("Renaming Files", len(files))
progress.log_message("Creating backup")

backup = tempfile.TemporaryDirectory()

# Copy dir as well
for f in files:
if os.path.isfile(os.path.join(p, f)):
origin = os.path.join(p, f)
destination = os.path.join(backup.name, f)
shutil.copy2(origin, destination)
else:
origin = os.path.join(p, f)
destination = os.path.join(backup.name, f)
shutil.copytree(origin, destination)

digits = len(os.listdir(p)) + count

with tempfile.TemporaryDirectory() as temporary_directory:
try:
progress.log_message("Copying Files")
# Move all of the files to a new directory, with new names
for f in files:
if os.path.isfile(os.path.join(p, f)):
end = os.path.splitext(f)[1]
origin = os.path.join(p, f)
new_name = str(count).zfill(len(str(digits))) + end
dest = os.path.join(temporary_directory, new_name)

os.rename(origin, dest)
progress.next()
progress.log_message("Renamed {0} as {1}".format(origin, new_name))

count += 1
else:
end = os.path.splitext(f)[1]
origin = os.path.join(p, f)
dest = os.path.join(temporary_directory, f)
progress.next()
progress.log_message("Did not modify {0}".format(origin))

# Replace old directory with temporary directory
try:
print(p)
os.rmdir(p)
#shutil.rmtree(p)
except:
print("No dir to remove")

progress.log_message("Saving")
shutil.copytree(temporary_directory, p)

except:
progress.log_message("Rename failed, restoring backup")
shutil.rmtree(p)
shutil.copytree(backup.name, p)

progress.destroy()

class HelpFrame(tk.Frame):
def __init__(self, parent):
tk.Frame.__init__(self, parent)
Expand All @@ -89,7 +200,6 @@ def __init__(self, parent):
email.grid(row=5, pady=5, sticky='ew')

def clip(self):
print("CLIP")
self.clipboard_clear()
self.clipboard_append('[email protected]')
self.update()
Expand Down Expand Up @@ -260,6 +370,7 @@ def __init__(self, root):
# Create dictionary variables for the three UI areas
self.left = {'valid':False, 'pages':[]}
self.right = {'valid':False, 'pages':[]}
self.utils = {}
self.output = {'valid':False, 'pages':[]}

self.create_gui()
Expand All @@ -269,9 +380,11 @@ def create_gui(self):
self.notebook = ttk.Notebook(self.root)
self.input_tab = tk.Frame(self.notebook)
self.output_tab = tk.Frame(self.notebook)
self.utils_tab = tk.Frame(self.notebook)
self.help_tab = tk.Frame(self.notebook)
self.notebook.add(self.input_tab, text="Input")
self.notebook.add(self.output_tab, text="Output")
self.notebook.add(self.utils_tab, text="Utilities")
self.notebook.add(self.help_tab, text="Help")
self.notebook.grid(row=0, column=0, sticky='nesw')

Expand All @@ -283,6 +396,8 @@ def create_gui(self):
ttk.Separator(self.input_tab, orient="horizontal").grid(row=1, column=0, sticky="ew")
self.right['frame'] = tk.Frame(self.input_tab)
self.right['frame'].grid(row=2, column=0, sticky='nesw', pady=15)
self.utils['frame'] = tk.Frame(self.utils_tab)
self.utils['frame'].grid(row=0, column=0, sticky='nesw', pady=15)
self.output['frame'] = tk.Frame(self.output_tab)
self.output['frame'].grid(row=0, column=0, sticky='nesw', pady=10)

Expand All @@ -300,6 +415,10 @@ def create_gui(self):
self.right['viewer'].grid(row=1, column=0, sticky='nesw', padx=10, pady=5)
self.right['frame'].columnconfigure(0, weight=1)

# Fill Utilities Frame
self.utils['renamer'] = RenameFrame(self.utils['frame'])
self.utils['renamer'].grid(row=0, column=0, sticky='nesw')

# Fill Output Frame
self.output['viewer'] = ThumbnailViewer(self.output['frame'])
self.output['browser'] = DirectoryBrowser(self.output['frame'], "Output Path:")
Expand Down Expand Up @@ -327,7 +446,6 @@ def create_gui(self):
self.right['browser'].callback = lambda area=self.right : self.on_input(area)

def on_viewer_update(self):
print("on viewer update")
merged = self.merge_lists(self.right['viewer'].pages, self.left['viewer'].pages)
merged = self.ungroup(merged)

Expand All @@ -346,11 +464,13 @@ def load_pages(self, directory):

temp = []
for path in paths:
p = Page(os.path.join(directory, path))
if not os.path.isdir(os.path.join(directory, path)):
p = Page(os.path.join(directory, path))

if p.thumb is not None:
temp.append(p)
progress.next()
if p.thumb is not None:
temp.append(p)
progress.next()
progress.log_message("Created thumbnail for {}".format(path))

progress.destroy()

Expand Down Expand Up @@ -384,6 +504,7 @@ def copy_files(self, files, out, pre="img_"):
shutil.copy2(files[i].path, new_path)

progress.next()
progress.log_message("Copied {0} to {1}".format(files[i].path, new_path))

progress.destroy()

Expand Down

0 comments on commit e01431c

Please sign in to comment.