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插入排序算法的实现代码
Nov 21 Python
Python新手实现2048小游戏
Mar 31 Python
Python黑魔法Descriptor描述符的实例解析
Jun 02 Python
python 中random模块的常用方法总结
Jul 08 Python
Python 实现使用dict 创建二维数据、DataFrame
Apr 13 Python
Python读写docx文件的方法
May 08 Python
python生成九宫格图片
Nov 19 Python
使用Python3+PyQT5+Pyserial 实现简单的串口工具方法
Feb 13 Python
原来我一直安装 Python 库的姿势都不对呀
Nov 11 Python
Pytorch之view及view_as使用详解
Dec 31 Python
django admin 根据choice字段选择的不同来显示不同的页面方式
May 13 Python
如何利用python读取micaps文件详解
Oct 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多种形式发送邮件(mail qmail邮件系统 phpmailer类)
2014/01/22 PHP
PHP查询快递信息的方法
2015/03/07 PHP
php中使用key,value,current,next和prev函数遍历数组的方法
2015/03/17 PHP
Cookie跨域问题解决方案代码示例
2020/11/24 PHP
利用js对象弹出一个层
2008/03/26 Javascript
基于jquery的页面划词搜索JS
2010/09/14 Javascript
javascript判断机器是否联网的2种方法
2013/08/09 Javascript
JS+CSS 制作的超级简单的下拉菜单附图
2013/11/22 Javascript
JS组件Form表单验证神器BootstrapValidator
2016/01/26 Javascript
jQuery实现的模拟弹出窗口功能示例
2016/11/24 Javascript
Bootstrap选项卡动态切换效果
2016/11/28 Javascript
基于vuejs实现一个todolist项目
2017/04/11 Javascript
Js实现京东无延迟菜单效果实例(demo)
2017/06/02 Javascript
代码详解javascript模块加载器
2018/03/04 Javascript
深入浅析Vue中的slots/scoped slots
2018/04/03 Javascript
详解vuex结合localstorage动态监听storage的变化
2018/05/03 Javascript
nodejs更改项目端口号的方法
2018/05/13 NodeJs
玩转vue的slot内容分发
2018/09/22 Javascript
原来JS还可以这样拆箱转换详解
2019/02/01 Javascript
vue-cli3 DllPlugin 提取公用库的方法
2019/04/24 Javascript
利用Electron简单撸一个Markdown编辑器的方法
2019/06/10 Javascript
详解vue高级特性
2020/06/09 Javascript
Python实现遍历windows所有窗口并输出窗口标题的方法
2015/03/13 Python
Fabric 应用案例
2016/08/28 Python
python使用生成器实现可迭代对象
2018/03/20 Python
python如何为创建大量实例节省内存
2018/03/20 Python
Python对象中__del__方法起作用的条件详解
2018/11/01 Python
Python实现删除排序数组中重复项的两种方法示例
2019/01/31 Python
连卡佛中国官网:Lane Crawford中文站
2018/01/27 全球购物
Elemis美国官网:英国的第一豪华护肤品牌
2018/03/15 全球购物
党员对照检查材料整改措施思想汇报
2014/09/26 职场文书
三八妇女节标语
2014/10/09 职场文书
机动车交通事故协议书
2015/01/29 职场文书
高二数学教学反思
2016/02/18 职场文书
商业计划书之服装
2019/09/09 职场文书
React Fragment介绍与使用详解
2021/11/11 Javascript