zoukankan      html  css  js  c++  java
  • Python: tkinter实例改名小工具

      1 #!/usr/bin/env python
      2 #coding=utf-8
      3 # 
      4 # 版权所有 2014 yao_yu (http://blog.csdn.net/yao_yu_126)
      5 # 本代码以MIT许可协议发布
      6 # 文件名批量加.xls后缀
      7 # 2014-04-21  创建
      8 # 
      9 
     10 import os
     11 import tkinter  as tk
     12 from tkinter    import ttk
     13 
     14 
     15 
     16 version = '2014-04-21'
     17 app_title = '文件名批量加后缀 Ver:' + version
     18 
     19 listdir = os.listdir
     20 isdir = os.path.isdir
     21 isfile = os.path.isfile
     22 path_join = os.path.join
     23 
     24 #----------------------------  Object Visit   ----------------------------#
     25 def visit_directory_files(root, visitor):
     26     for i in listdir(root):
     27         i = path_join(root, i)
     28         if isdir(i):
     29             if visit_directory_files(i, visitor):
     30                 return True
     31         elif isfile(i):
     32             if visitor(i):
     33                 return True
     34 
     35 #----------------------------    Visitor   ----------------------------#
     36 class ListVisitor(object):
     37     def __init__(self, *visitors, terminate = True):
     38         if (visitors 
     39                  and isinstance(visitors, (list, tuple)) 
     40                  and isinstance(visitors[0], (list, tuple))):
     41             visitors = visitors[0]
     42         self._visitors = list(visitors)
     43         self._terminate = terminate
     44     def __call__(self, *args, **kwdargs):
     45         for visitor in self._visitors:
     46             if visitor(*args, **kwdargs):
     47                 return self._terminate
     48     def append(self, visitor):
     49         assert(visitor)
     50         self._visitors.append(visitor)
     51 
     52 def get_screen_size(window):
     53     return window.winfo_screenwidth(),window.winfo_screenheight()
     54   
     55 def get_window_size(window):
     56     return window.winfo_reqwidth(),window.winfo_reqheight()
     57   
     58 def center_window(root, width, height):
     59     screenwidth = root.winfo_screenwidth()
     60     screenheight = root.winfo_screenheight()
     61     size = '%dx%d+%d+%d' % (width, height, (screenwidth - width)/2, (screenheight - height)/2)
     62     root.geometry(size)
     63     
     64 class Application(object):
     65     def __init__(self, master):
     66         self.master = ttk.Frame(master)
     67         self.master.pack(side = tk.TOP, expand = tk.YES, fill = tk.BOTH)
     68         self.create_widgets()
     69         
     70     def create_widgets(self):
     71         master = self.master
     72         master.columnconfigure(1, weight=1)
     73         master.rowconfigure(2, weight=1)
     74         self.targetdir = tk.StringVar()
     75         self.targetdir.set('/Volumes/Data/Document/Test')
     76         padx = 5
     77         pady = 10
     78         ttk.Label(master, text="操作目录").grid(row = 0, column = 0, stick = tk.E, padx = padx, pady = pady)
     79         ttk.Entry(master, textvariable = self.targetdir).grid(row = 0, column = 1, stick = tk.EW, padx = padx)
     80         commands = ttk.Frame(master)
     81         commands.grid(row = 1, column = 0, columnspan = 2)
     82         ttk.Button(commands, text="开始", command = self.onStart).pack(side = tk.LEFT)
     83         ttk.Button(commands, text="退出", command = master.quit).pack(side = tk.LEFT)
     84         
     85         self.status = tk.StringVar()
     86         self.status.set('就绪')
     87         master.rowconfigure(3, minsize = 160)
     88         ttk.Label(master, textvariable = self.status, wraplength=600).grid(row = 3, column = 0, columnspan = 2, padx = padx, stick = tk.NSEW)
     89         self.progress = ttk.Progressbar(master, maximum=100, orient=tk.HORIZONTAL, mode='determinate')
     90         self.progress.grid(row = 4, column = 0, columnspan = 2, padx = padx, stick = tk.NSEW)
     91         
     92     def onStart(self):
     93         targetdir = self.targetdir.get().strip()
     94         basename = os.path.basename(targetdir)
     95         if os.path.isdir(targetdir):
     96             listvisitor = ListVisitor(ProgressVisitor(self.progress),
     97                                         self.StatusVisitor(),
     98                                         FileLogVisitor(basename),
     99                                         #FileRenameVisitor(basename),
    100                                         )
    101             visit_directory_files(targetdir, listvisitor)
    102         else:
    103             self.status.set('目标目录不存在')
    104     
    105     def StatusVisitor(self):
    106         print_status = self.status.set
    107         def __call__(file):
    108             __call__.n += 1
    109             print_status('%s,%s' % (__call__.n, file))
    110         __call__.n = 0
    111         return __call__
    112 
    113 splitext = os.path.splitext
    114 file_rename = os.rename
    115 knownexts = dict.fromkeys(['.jpg', '.log', '.pdf', '.tif', '.xls', '.zip', '.rar'])
    116 class FileRenameVisitor(object):
    117     def __init__(self, file):
    118         self.__fp = open('%s_%s_rename.txt' % (os.path.splitext(__file__)[0], file), 'w')
    119     def __call__(self, file):
    120         ext = splitext(file)[1].lower()
    121         if ext not in knownexts:
    122             file_rename(file, file + '.xls')
    123             self.__fp.write('%s
    ' % file)
    124     def __del__(self):
    125         self.__fp.close()
    126 
    127 class FileLogVisitor(object):
    128     def __init__(self, file):
    129         self.__fp = open('%s_%s_all.txt' % (os.path.splitext(__file__)[0], file), 'w')
    130     def __call__(self, file):
    131         self.__fp.write('%s
    ' % file)
    132     def __del__(self):
    133         self.__fp.close()
    134 
    135 class ProgressVisitor(object):
    136     COUNT = 202
    137     def __init__(self, progress, count=COUNT):
    138         self.progress = progress
    139         if count and isinstance(count, int) and count > 0:
    140             self.count = count
    141         else:
    142             self.count = self.COUNT
    143         self.n = 1
    144     def __call__(self, *args, **kwdargs):
    145         self.n += 1
    146         if self.n == self.count:
    147             self.progress.step()
    148             self.progress.update()
    149             self.n = 1
    150     def __del__(self):
    151         self.progress['value'] = 0
    152         
    153 
    154 if __name__ == '__main__':
    155     root = tk.Tk()
    156     root.title(app_title)
    157     app = Application(root)
    158     center_window(root, 600, 240)
    159     tk.mainloop()
  • 相关阅读:
    json批量设置DIV属性
    随机产生div背景颜色变化
    发送验证码倒计时
    购物网站倒计时
    ARC066B
    [Poi2011]Conspiracy
    CF1103E Radix Sum
    NOI2018 冒泡排序
    CometOJ 5E
    NOI2020 命运
  • 原文地址:https://www.cnblogs.com/yaoyu126/p/Python_tkinter_rename_tool.html
Copyright © 2011-2022 走看看