#!/usr/bin/env python
#coding=utf-8
#
# 版权所有 2014 yao_yu (http://blog.csdn.net/yao_yu_126)
# 本代码以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: tkinter实例改名小工具的更多相关文章

  1. python开发目录合并小工具 PathMerge

    前言 这个程序陆陆续续开发了几天,正好我在学Python,就一边做一边学,倒是学到不少东西. 不得不说python是快速开发的好工具. 程序做了一些改进,这两天又忙着毕设,现在才想起来发到博客上.想想 ...

  2. python 3.6 MJ小工具

    2017.07.14 update 做了个界面,不需要使用cmd命令行+文件路径的方式来使用了: 链接如下: http://www.cnblogs.com/chenyuebai/p/7150382.h ...

  3. 目不识丁的我使用Python编写汉字注音小工具

    一万点暴击伤害 人懒起来太可怕了,放了个十一充分激发了我的惰性.然后公众号就这么停了半个月,好惭愧- 新学期儿子的幼儿园上线了APP,每天作业通过app布置后,家长需要陪着孩子学习,并上传视频才算完成 ...

  4. 基于python2.7 Tkinter 做一个小工具

    1.源码:先写一个界面出来,放需要放入的点击事件的函数 # -*- coding:utf-8 -*- import Tkinter from Tkinter import * import Excle ...

  5. python -Tkinter 实现一个小计算器功能

    文章来源:http://www.cnblogs.com/Skyyj/p/6618739.html 本代码是基于python 2.7的 如果是对于python3.X  则需要将 tkinter 改为Tk ...

  6. 基于python tkinter的点名小程序

    import datetimeimport jsonimport osimport randomimport tkinter as tkimport openpyxl # 花名册文件名excel_fi ...

  7. python转exe的小工具

    其实只是在cxfreeze的基础上加了个壳,做成窗口软件了 使用了pyqt做的界面,软件发布在了开源中国上,可以直接去下面的地址查看 http://git.oschina.net/robocky/py ...

  8. 入坑python 自己写的小工具,纪念一下

    这个程序的功能是可以从表格中读取某一列数据,传到IDs 这一个参数里,然后在url中获取相应的请求值,并打印 import urllib.request import json import xlrd ...

  9. python一些实用的小工具

    1  搭一个简易的本地局域网  python -m http.server 2 获取当前目录下的所有文件名 3 进度条效果 import sys,time for i in range(50): sy ...

随机推荐

  1. BootStrap2学习日记2--将固定布局换成响应式布局

    概要:响应式页面是指页面根据浏览平台(尺寸)的不同显示不同的CSS. 原理:在Html的的头加入代码 <style> /*当浏览器宽度大于767是 采用括号里面的CSS样式*/ @medi ...

  2. Android进阶笔记10:Android 万能适配器

    1. Android 万能适配器      项目中Listview GridView几乎是必用的组件,Android也提供一套机制,为这些控件绑定数据,那就是Adapter.用起来虽然还不错,但每次都 ...

  3. 最简单好用的SSO - 能经得起几万并发用户的SSO 组件使用方法介绍

    项目中使用了通用权限管理系统,该系统集成了单点登录功能,下面我来介绍下该单点登录实现的一些细节. 首先我们来看看其登录接口,系统本身支持各种登录方式: 1.公司名.用户名.密码 2.唯一账号.密码 3 ...

  4. Javascript与Ajax

    不使用jquery来处理ajax请求该怎么做? 首先要明确html中的某些数据需要从服务端获得,也就是客户端向服务端请求(request)数据,服务端就响应(response)这个请求,把客户端要的数 ...

  5. Linux vsftp

    本机环境CentOS-6.6-i386-bin-DVD1.iso安装盘.安装时选择minimal模式.本机IP地址配置为192.168.0.211. 1.查询系统是否已安装了vsftpd [root@ ...

  6. Oracle中exists与in的区别

    有两个简单例子,以说明 "exists"和"in"的效率问题 1) select * from T1 where exists(select 1 from T2 ...

  7. 【记忆化搜索】Codeforces Round #295 (Div. 2) B - Two Buttons

    题意:给你一个数字n,有两种操作:减1或乘2,问最多经过几次操作能变成m: 随后发篇随笔普及下memset函数的初始化问题.自己也是涨了好多姿势. 代码 #include<iostream> ...

  8. (译)如何在ASP.NET中安全使用ViewState

    原文:http://www.codeproject.com/Articles/150688/How-to-make-ViewState-secure-in-ASP-NET 介绍 ASP.NET中的Vi ...

  9. hdoj1423 最长上升公共子序列

    hdoj1423 题目分析: 两个数组a[n1] , b[n2], 求最长上升公共子序列. 我们可用一维存储 f[i] 表示 b 数组以 j 结尾, 与 a[] 数组构成的最长公共上升子序列. 对数组 ...

  10. ASP.NET中页面加载时文本框(texbox控件)内有文字获得焦点时文字消失

    代码如下: <asp:TextBox ID="TextBox1" runat="server" Height="26px" MaxLe ...