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进阶教程之词典、字典、dict
Aug 29 Python
python清除字符串里非字母字符的方法
Jul 02 Python
Python字符串处理实现单词反转
Jun 14 Python
python 简单搭建阻塞式单进程,多进程,多线程服务的实例
Nov 01 Python
python简单实现操作Mysql数据库
Jan 29 Python
使用python将请求的requests headers参数格式化方法
Jan 02 Python
pytorch 实现cross entropy损失函数计算方式
Jan 02 Python
Python模拟键盘输入自动登录TGP
Nov 27 Python
python switch 实现多分支选择功能
Dec 21 Python
用60行代码实现Python自动抢微信红包
Feb 04 Python
python数据抓取3种方法总结
Feb 07 Python
Python 一键获取电脑浏览器的账号密码
May 11 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获取文件夹大小函数用法实例
2015/07/01 PHP
PHP如何防止用户重复提交表单
2020/12/09 PHP
jQuery-onload让第一次页面加载时图片是淡入方式显示
2012/05/23 Javascript
JavaScript对象和字串之间的转换实例探讨
2013/04/21 Javascript
IE8的JavaScript点击事件(onclick)不兼容的解决方法
2013/11/22 Javascript
javascript常用的方法整理
2015/08/20 Javascript
基于javascript实现动态显示当前系统时间
2016/01/28 Javascript
js贪吃蛇游戏实现思路和源码
2016/04/14 Javascript
js 点击a标签 获取a的自定义属性方法
2016/11/21 Javascript
js使用i18n实现页面国际化的方法
2017/05/09 Javascript
React-router 4 按需加载的实现方式及原理详解
2017/05/25 Javascript
深入理解jquery的$.extend()、$.fn和$.fn.extend()
2017/07/08 jQuery
详解webpack提取第三方库的正确姿势
2017/12/22 Javascript
在vscode里使用.vue代码模板的方法
2018/04/28 Javascript
layui实现点击按钮给table添加一行
2018/08/10 Javascript
layui实现数据分页功能
2019/07/27 Javascript
layui 弹出删除确认界面的实例
2019/09/06 Javascript
vue+webpack 更换主题N种方案优劣分析
2019/10/28 Javascript
Element MessageBox弹框的具体使用
2020/07/27 Javascript
JavaScript经典案例之简易计算器
2020/08/24 Javascript
解决Vue-cli无法编译es6的问题
2020/10/30 Javascript
[40:55]Liquid vs LGD 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
简单介绍Python的Tornado框架中的协程异步实现原理
2015/04/23 Python
python类继承用法实例分析
2015/05/27 Python
Python实现冒泡排序的简单应用示例
2017/12/11 Python
分享Pycharm中一些不为人知的技巧
2018/04/03 Python
切尔西足球俱乐部官方网上商店:Chelsea FC
2019/06/17 全球购物
初中女生自我鉴定
2013/12/19 职场文书
初中生毕业评语
2014/12/29 职场文书
2015年机关纠风工作总结
2015/05/15 职场文书
离职信范本
2015/06/23 职场文书
大学生入党自传2015
2015/06/26 职场文书
教师节表彰会主持词
2015/07/06 职场文书
国家助学金受助感言
2015/08/01 职场文书
《你在为谁工作》心得体会(共8篇)
2016/01/20 职场文书
IDEA2021.2配置docker如何将springboot项目打成镜像一键发布部署
2021/09/25 Java/Android