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中list列表的高级函数
May 17 Python
Python简单删除列表中相同元素的方法示例
Jun 12 Python
Python如何实现转换URL详解
Jul 02 Python
简单了解python反射机制的一些知识
Jul 13 Python
Python 使用 Pillow 模块给图片添加文字水印的方法
Aug 30 Python
简单了解Python write writelines区别
Feb 27 Python
python实现扫雷游戏
Mar 03 Python
jupyter notebook 多行输出实例
Apr 09 Python
python装饰器实现对异常代码出现进行自动监控的实现方法
Sep 15 Python
如何利用Python matplotlib绘制雷达图
Dec 21 Python
PyQt实现计数器的方法示例
Jan 18 Python
如何使用Python实现一个简易的ORM模型
May 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
redis+php实现微博(三)微博列表功能详解
2019/09/23 PHP
详解Laravel设置多态关系模型别名的方式
2019/10/17 PHP
Javascript笔记一 js以及json基础使用说明
2010/05/22 Javascript
Jquery选择器中使用变量实现动态选择例子
2014/07/25 Javascript
深入理解JavaScript系列(38):设计模式之职责链模式详解
2015/03/04 Javascript
可以浮动某个物体的jquery控件用法实例
2015/07/24 Javascript
基于JavaScript如何制作遮罩层对话框
2016/01/26 Javascript
基于javascript实现句子翻牌网页版小游戏
2016/03/23 Javascript
Dojo获取下拉框的文本和值实例代码
2016/05/27 Javascript
js中常用的Tab切换效果(推荐)
2016/08/30 Javascript
总结Javascript中数组各种去重的方法
2016/10/04 Javascript
vue.js源代码core scedule.js学习笔记
2017/07/03 Javascript
代码实例ajax实现点击加载更多数据图片
2018/10/12 Javascript
JS动画实现回调地狱promise的实例代码详解
2018/11/08 Javascript
jQuery实现点击旋转,再点击恢复初始状态动画效果示例
2018/12/11 jQuery
解决vue请求接口第一次成功,第二次失败问题
2020/09/08 Javascript
nuxt 服务器渲染动态设置 title和seo关键字的操作
2020/11/05 Javascript
[01:11:37]完美世界DOTA2联赛PWL S2 SZ vs FTD.C 第一场 11.19
2020/11/19 DOTA
Python中的数据对象持久化存储模块pickle的使用示例
2016/03/03 Python
全面了解Python的getattr(),setattr(),delattr(),hasattr()
2016/06/14 Python
用Python将mysql数据导出成json的方法
2018/08/21 Python
Python简单获取二维数组行列数的方法示例
2018/12/21 Python
python库matplotlib绘制坐标图
2019/10/18 Python
使用keras实现Precise, Recall, F1-socre方式
2020/06/15 Python
详解python中的异常捕获
2020/12/15 Python
美国的Eastbay旗下的运动款子品牌:Final-Score
2018/01/01 全球购物
巴西手表购物网站:eclock
2019/03/19 全球购物
顶撞老师检讨书
2014/02/07 职场文书
初中生评语大全
2014/04/24 职场文书
拒绝黄毒毒宣传标语
2014/06/26 职场文书
对领导班子的意见和建议
2015/06/08 职场文书
2016年党校科级干部培训班学习心得体会
2016/01/06 职场文书
mysql优化之query_cache_limit参数说明
2021/07/01 MySQL
新手初学Java List 接口
2021/07/07 Java/Android
什么是SOLID
2022/03/24 Javascript
Python自动化实战之接口请求的实现
2022/05/30 Python