本文实例讲述了Python基于tkinter模块实现的改名小工具。分享给大家供大家参考,具体如下:
#!/usr/bin/env python#coding=utf-8# # 版权所有 2014 yao_yu# 本代码以MIT许可协议发布# 文件名批量加.xls后缀# 2014-04-21 创建# import osimport tkinter as tkfrom tkinter import ttkversion = '2014-04-21'app_title = '文件名批量加后缀 Ver:' + versionlistdir = os.listdirisdir = os.path.isdirisfile = os.path.isfilepath_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="操作目录").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="开始", command = self.onStart).pack(side = tk.LEFT) ttk.Button(commands, text="退出", command = master.quit).pack(side = tk.LEFT) self.status = tk.StringVar() self.status.set('就绪') 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('目标目录不存在') 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.splitextfile_rename = os.renameknownexts = 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'] = 0if __name__ == '__main__': root = tk.Tk() root.title(app_title) app = Application(root) center_window(root, 600, 240) tk.mainloop()
希望本文所述对大家Python程序设计有所帮助。
新闻热点
疑难解答