本文实例讲述了Python基于tkinter模块实现的改名小工具。分享给大家供大家参考,具体如下:
#!/usr/bin/env python #coding=utf-8 # # 版权所有 2014 yao_yu # 本代码以MIT许可协议发布 # 文件名批量加.xls后缀 # 2014-04-21 创建 # import os import tkinter as tk from tkinter import ttk version = '2014-04-21' app_title = '文件名批量加后缀 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],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,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,columnspan = 2,stick = tk.NSEW) self.progress = ttk.Progressbar(master,maximum=100,orient=tk.HORIZONTAL,mode='determinate') self.progress.grid(row = 4,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.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): 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,**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()
更多关于Python相关内容感兴趣的读者可查看本站专题:《Python编码操作技巧总结》、《Python数据结构与算法教程》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》及《Python入门与进阶经典教程》
希望本文所述对大家Python程序设计有所帮助。