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 IDLE 错误:IDLE''s subprocess didn''t make connection 的解决方案
Feb 13 Python
简单谈谈python中的语句和语法
Aug 10 Python
python使用zip将list转为json的方法
Dec 31 Python
Python获取航线信息并且制作成图的讲解
Jan 03 Python
如何使用Python 打印各种三角形
Jun 28 Python
python 字典的打印实现
Sep 26 Python
Python matplotlib以日期为x轴作图代码实例
Nov 22 Python
Python基于Tensor FLow的图像处理操作详解
Jan 15 Python
python pyecharts 实现一个文件绘制多张图
May 13 Python
Tensorflow实现将标签变为one-hot形式
May 22 Python
Python爬取酷狗MP3音频的步骤
Feb 26 Python
Python基础数据类型tuple元组的概念与用法
Aug 02 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 删除一个目录及目录下的所有文件的函数代码
2010/05/26 PHP
destoon之一键登录设置
2014/06/21 PHP
php常用文件操作函数汇总
2014/11/22 PHP
PHP连接操作access数据库实例
2015/03/30 PHP
php将日期格式转换成xx天前的格式
2015/04/16 PHP
PHP实现微信发红包程序
2015/08/24 PHP
thinkPHP查询方式小结
2016/01/09 PHP
php表单加入Token防止重复提交的方法分析
2016/10/10 PHP
php实现的错误处理封装类实例
2017/06/20 PHP
Tips 带三角可关闭的文字提示
2010/10/06 Javascript
js如何设置在iframe框架中指定div不显示
2013/12/04 Javascript
js 判断控件获得焦点的示例代码
2014/03/04 Javascript
在JavaScript中处理数组之reverse()方法的使用
2015/06/09 Javascript
JS实现双击编辑可修改状态的方法
2015/08/14 Javascript
JavaScript实现表格快速变色效果代码
2015/08/19 Javascript
js判断复选框是否选中及选中个数的实现代码
2016/05/30 Javascript
一种基于浏览器的自动小票机打印实现方案(js版)
2016/07/26 Javascript
对javascript继承的理解
2016/10/11 Javascript
基于vue展开收起动画的示例代码
2018/07/05 Javascript
vue-cli3中vue.config.js配置教程详解
2019/05/29 Javascript
微信小程序与公众号实现数据互通的方法
2019/07/25 Javascript
vue+导航锚点联动-滚动监听和点击平滑滚动跳转实例
2019/11/13 Javascript
浅谈javascript事件环微任务和宏任务队列原理
2020/09/12 Javascript
python实现文件分组复制到不同目录的例子
2014/06/04 Python
python实现支持目录FTP上传下载文件的方法
2015/06/03 Python
Python使用cx_Oracle模块操作Oracle数据库详解
2018/05/07 Python
kafka监控获取指定topic的消息总量示例
2019/12/23 Python
HTML5 audio标签使用js进行播放控制实例
2015/04/24 HTML / CSS
StubHub新加坡:购买和出售全球活动门票
2017/03/10 全球购物
VisionPros美国站:加拿大在线隐形眼镜和眼镜零售商
2020/02/11 全球购物
小学家长评语大全
2014/04/16 职场文书
四年级学生评语大全
2014/04/21 职场文书
英文求职信范文
2014/05/23 职场文书
党员领导干部承诺书
2014/05/28 职场文书
一年级数学上册复习计划
2015/01/17 职场文书
农村婚庆主持词
2015/06/29 职场文书