Python基于tkinter模块实现的改名小工具示例


Posted in Python onJuly 27, 2017

本文实例讲述了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], (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.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()

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
Python的另外几种语言实现
Jan 29 Python
使用IronPython把Python脚本集成到.NET程序中的教程
Mar 31 Python
Python CSV模块使用实例
Apr 09 Python
详解Python的Django框架中的中间件
Jul 24 Python
Android分包MultiDex策略详解
Oct 30 Python
pandas DataFrame 根据多列的值做判断,生成新的列值实例
May 18 Python
对PyQt5中的菜单栏和工具栏实例详解
Jun 20 Python
python logging通过json文件配置的步骤
Apr 27 Python
Python并发concurrent.futures和asyncio实例
May 04 Python
Python日志器使用方法及原理解析
Sep 27 Python
python实现在列表中查找某个元素的下标示例
Nov 16 Python
python 使用openpyxl读取excel数据
Feb 18 Python
python django 增删改查操作 数据库Mysql
Jul 27 #Python
Python中Selenium模拟JQuery滑动解锁实例
Jul 26 #Python
Python列表和元组的定义与使用操作示例
Jul 26 #Python
老生常谈Python之装饰器、迭代器和生成器
Jul 26 #Python
python基础之入门必看操作
Jul 26 #Python
Python简单定义与使用字典dict的方法示例
Jul 25 #Python
Python学习入门之区块链详解
Jul 25 #Python
You might like
PHP新手入门学习方法
2011/05/08 PHP
php打造属于自己的MVC框架
2012/03/07 PHP
phpmailer发送邮件之后,返回收件人是否阅读了邮件的方法
2014/07/19 PHP
PHP中使用hidef扩展代替define提高性能
2015/04/09 PHP
PHP使用星号隐藏用户名,手机和邮箱的实现方法
2016/09/22 PHP
defer属性导致引用JQuery的页面报“浏览器无法打开网站xxx,操作被中止”错误的解决方法
2010/04/27 Javascript
Jquery判断IE6等浏览器的代码
2011/04/05 Javascript
禁用页面部分JavaScript方法的具体实现
2013/07/31 Javascript
jquery关于事件冒泡和事件委托的技巧及阻止与允许事件冒泡的三种实现方法
2015/11/27 Javascript
jquery validate表单验证的基本用法入门
2016/01/18 Javascript
jQuery 如何给Carousel插件添加新的功能
2016/04/18 Javascript
JavaScript的模块化开发框架Sea.js上手指南
2016/05/12 Javascript
js实现砖头在页面拖拉效果
2020/11/20 Javascript
javascript 注释代码的几种方法总结
2017/01/04 Javascript
Javascript中return的使用与闭包详解
2017/01/11 Javascript
Bootstrap提示框效果的实例代码
2017/07/12 Javascript
vue中轮训器的使用
2019/01/27 Javascript
Layui表格行工具事件与数据回填方法
2019/09/13 Javascript
node.JS事件机制与events事件模块的使用方法详解
2020/02/06 Javascript
Python使用random和tertools模块解一些经典概率问题
2015/01/28 Python
Django objects的查询结果转化为json的三种方式的方法
2018/11/07 Python
python内存动态分配过程详解
2019/07/15 Python
python各类经纬度转换的实例代码
2019/08/08 Python
基于python读取.mat文件并取出信息
2019/12/16 Python
python3的pip路径在哪
2020/06/23 Python
浅谈Html5中视频 音频标签 进度条的问题
2016/07/26 HTML / CSS
英国复古和经典球衣网站:Vintage Football Shirts
2018/10/05 全球购物
学校办公室主任职责
2013/12/27 职场文书
课堂教学改革实施方案
2014/03/17 职场文书
本科毕业自我鉴定
2014/03/20 职场文书
高中家长寄语
2014/04/02 职场文书
综合测评个人总结
2015/03/03 职场文书
2017年寒假少先队活动总结
2016/04/06 职场文书
应届生个人的求职(自荐信范文2篇)
2019/08/23 职场文书
详细聊一聊mysql的树形结构存储以及查询
2022/04/05 MySQL
MySQL使用IF语句及用case语句对条件并结果进行判断 
2022/09/23 MySQL