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中cPickle用法例子分享
Jan 03 Python
python网络编程学习笔记(一)
Jun 09 Python
python RabbitMQ 使用详细介绍(小结)
Nov 08 Python
python实现向微信用户发送每日一句 python实现微信聊天机器人
Mar 27 Python
详解python实现小波变换的一个简单例子
Jul 18 Python
Python pandas实现excel工作表合并功能详解
Aug 29 Python
Python程序暂停的正常处理方法
Nov 07 Python
python 如何去除字符串头尾的多余符号
Nov 19 Python
通过Turtle库在Python中绘制一个鼠年福鼠
Feb 03 Python
Python键鼠操作自动化库PyAutoGUI简介(小结)
May 17 Python
Pandas之缺失数据的实现
Jan 06 Python
Python内置包对JSON文件数据进行编码和解码
Apr 12 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
一个改进的UBB类
2006/10/09 PHP
PHP array_multisort()函数的使用札记
2011/07/03 PHP
PHP输出时间差函数代码
2013/01/28 PHP
php实现约瑟夫问题的方法小结
2015/03/23 PHP
PHP实现根据图片色界在不同位置加水印的方法
2015/08/08 PHP
PHP实现的oracle分页函数实例
2016/01/25 PHP
php 使用curl模拟登录人人(校内)网的简单实例
2016/06/06 PHP
tagName的使用,留一笔
2006/06/26 Javascript
javascript中的对象和数组的应用技巧
2007/01/07 Javascript
JavaScript Prototype对象
2009/01/07 Javascript
javascript 关闭IE6、IE7
2009/06/01 Javascript
JS操作select下拉框动态变动(创建/删除/获取)
2013/06/02 Javascript
ECMAScript6的新特性箭头函数(Arrow Function)详细介绍
2014/06/07 Javascript
使用canvas及js简单生成验证码方法
2017/04/02 Javascript
JavaScript之创意时钟项目(实例讲解)
2017/10/23 Javascript
vue父子模板传值问题解决方法案例分析
2020/02/26 Javascript
vuex管理状态仓库使用详解
2020/07/29 Javascript
python生成IP段的方法
2015/07/07 Python
python3 对list中每个元素进行处理的方法
2018/06/29 Python
基于python历史天气采集的分析
2019/02/14 Python
python之拟合的实现
2019/07/19 Python
python与idea的集成的实现
2020/11/20 Python
python 基于opencv 实现一个鼠标绘图小程序
2020/12/11 Python
自我鉴定注意事项
2014/01/19 职场文书
电脑饰品店的创业计划书
2014/01/21 职场文书
幼儿园教师工作感言
2014/02/15 职场文书
如何写好建议书
2014/03/13 职场文书
大学开学计划书
2014/04/30 职场文书
2014领导班子四风问题查摆思想汇报
2014/09/13 职场文书
民主评议党员自我评议范文2014
2014/09/26 职场文书
单位工作证明格式模板
2014/10/04 职场文书
保安2014年终工作总结
2014/12/06 职场文书
离婚案件上诉状
2015/05/23 职场文书
让世界充满爱观后感
2015/06/10 职场文书
七年级生物教学反思
2016/02/20 职场文书
担保书范文
2019/07/09 职场文书