Python example rename gadget based on tkinter module implementation
- 2020-06-12 09:59:27
- OfStack
This article illustrates Python's renaming gadget based on the tkinter module. To share for your reference, specific as follows:
#!/usr/bin/env python
#coding=utf-8
#
# All rights reserved 2014 yao_yu
# This code is to MIT Release of License Agreement
# File name batch addition .xls The suffix
# 2014-04-21 create
#
import os
import tkinter as tk
from tkinter import ttk
version = '2014-04-21'
app_title = ' Add suffixes to filenames in batches Ver:' + version
listdir = os.listdir
isdir = os.path.isdir
isfile = os.path.isfile
path_join = os.path.join
#---------------------------- Object Visit ----------------------------#
def visit_directory_files(root, visitor):
for i in listdir(root):
i = path_join(root, i)
if isdir(i):
if visit_directory_files(i, visitor):
return True
elif isfile(i):
if visitor(i):
return True
#---------------------------- Visitor ----------------------------#
class ListVisitor(object):
def __init__(self, *visitors, terminate = True):
if (visitors
and isinstance(visitors, (list, tuple))
and isinstance(visitors[0], (list, tuple))):
visitors = visitors[0]
self._visitors = list(visitors)
self._terminate = terminate
def __call__(self, *args, **kwdargs):
for visitor in self._visitors:
if visitor(*args, **kwdargs):
return self._terminate
def append(self, visitor):
assert(visitor)
self._visitors.append(visitor)
def get_screen_size(window):
return window.winfo_screenwidth(),window.winfo_screenheight()
def get_window_size(window):
return window.winfo_reqwidth(),window.winfo_reqheight()
def center_window(root, width, height):
screenwidth = root.winfo_screenwidth()
screenheight = root.winfo_screenheight()
size = '%dx%d+%d+%d' % (width, height, (screenwidth - width)/2, (screenheight - height)/2)
root.geometry(size)
class Application(object):
def __init__(self, master):
self.master = ttk.Frame(master)
self.master.pack(side = tk.TOP, expand = tk.YES, fill = tk.BOTH)
self.create_widgets()
def create_widgets(self):
master = self.master
master.columnconfigure(1, weight=1)
master.rowconfigure(2, weight=1)
self.targetdir = tk.StringVar()
self.targetdir.set('/Volumes/Data/Document/Test')
padx = 5
pady = 10
ttk.Label(master, text=" Operating directory ").grid(row = 0, column = 0, stick = tk.E, padx = padx, pady = pady)
ttk.Entry(master, textvariable = self.targetdir).grid(row = 0, column = 1, stick = tk.EW, padx = padx)
commands = ttk.Frame(master)
commands.grid(row = 1, column = 0, columnspan = 2)
ttk.Button(commands, text=" start ", command = self.onStart).pack(side = tk.LEFT)
ttk.Button(commands, text=" exit ", command = master.quit).pack(side = tk.LEFT)
self.status = tk.StringVar()
self.status.set(' ready ')
master.rowconfigure(3, minsize = 160)
ttk.Label(master, textvariable = self.status, wraplength=600).grid(row = 3, column = 0, columnspan = 2, padx = padx, stick = tk.NSEW)
self.progress = ttk.Progressbar(master, maximum=100, orient=tk.HORIZONTAL, mode='determinate')
self.progress.grid(row = 4, column = 0, columnspan = 2, padx = padx, stick = tk.NSEW)
def onStart(self):
targetdir = self.targetdir.get().strip()
basename = os.path.basename(targetdir)
if os.path.isdir(targetdir):
listvisitor = ListVisitor(ProgressVisitor(self.progress),
self.StatusVisitor(),
FileLogVisitor(basename),
#FileRenameVisitor(basename),
)
visit_directory_files(targetdir, listvisitor)
else:
self.status.set(' The target directory does not exist ')
def StatusVisitor(self):
print_status = self.status.set
def __call__(file):
__call__.n += 1
print_status('%s,%s' % (__call__.n, file))
__call__.n = 0
return __call__
splitext = os.path.splitext
file_rename = os.rename
knownexts = dict.fromkeys(['.jpg', '.log', '.pdf', '.tif', '.xls', '.zip', '.rar'])
class FileRenameVisitor(object):
def __init__(self, file):
self.__fp = open('%s_%s_rename.txt' % (os.path.splitext(__file__)[0], file), 'w')
def __call__(self, file):
ext = splitext(file)[1].lower()
if ext not in knownexts:
file_rename(file, file + '.xls')
self.__fp.write('%s\n' % file)
def __del__(self):
self.__fp.close()
class FileLogVisitor(object):
def __init__(self, file):
self.__fp = open('%s_%s_all.txt' % (os.path.splitext(__file__)[0], file), 'w')
def __call__(self, file):
self.__fp.write('%s\n' % file)
def __del__(self):
self.__fp.close()
class ProgressVisitor(object):
COUNT = 202
def __init__(self, progress, count=COUNT):
self.progress = progress
if count and isinstance(count, int) and count > 0:
self.count = count
else:
self.count = self.COUNT
self.n = 1
def __call__(self, *args, **kwdargs):
self.n += 1
if self.n == self.count:
self.progress.step()
self.progress.update()
self.n = 1
def __del__(self):
self.progress['value'] = 0
if __name__ == '__main__':
root = tk.Tk()
root.title(app_title)
app = Application(root)
center_window(root, 600, 240)
tk.mainloop()
For more information about Python, please refer to Python Coding Skills summary, Python Data Structure and Algorithm Tutorial, Python Function Skills Summary, Python String Manipulation Skills Summary and Python Introduction and Advanced Classic Tutorial.
I hope this article has been helpful in Python programming.