Python: tkinter实例改名小工具
#!/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实例改名小工具的更多相关文章
- python开发目录合并小工具 PathMerge
前言 这个程序陆陆续续开发了几天,正好我在学Python,就一边做一边学,倒是学到不少东西. 不得不说python是快速开发的好工具. 程序做了一些改进,这两天又忙着毕设,现在才想起来发到博客上.想想 ...
- python 3.6 MJ小工具
2017.07.14 update 做了个界面,不需要使用cmd命令行+文件路径的方式来使用了: 链接如下: http://www.cnblogs.com/chenyuebai/p/7150382.h ...
- 目不识丁的我使用Python编写汉字注音小工具
一万点暴击伤害 人懒起来太可怕了,放了个十一充分激发了我的惰性.然后公众号就这么停了半个月,好惭愧- 新学期儿子的幼儿园上线了APP,每天作业通过app布置后,家长需要陪着孩子学习,并上传视频才算完成 ...
- 基于python2.7 Tkinter 做一个小工具
1.源码:先写一个界面出来,放需要放入的点击事件的函数 # -*- coding:utf-8 -*- import Tkinter from Tkinter import * import Excle ...
- python -Tkinter 实现一个小计算器功能
文章来源:http://www.cnblogs.com/Skyyj/p/6618739.html 本代码是基于python 2.7的 如果是对于python3.X 则需要将 tkinter 改为Tk ...
- 基于python tkinter的点名小程序
import datetimeimport jsonimport osimport randomimport tkinter as tkimport openpyxl # 花名册文件名excel_fi ...
- python转exe的小工具
其实只是在cxfreeze的基础上加了个壳,做成窗口软件了 使用了pyqt做的界面,软件发布在了开源中国上,可以直接去下面的地址查看 http://git.oschina.net/robocky/py ...
- 入坑python 自己写的小工具,纪念一下
这个程序的功能是可以从表格中读取某一列数据,传到IDs 这一个参数里,然后在url中获取相应的请求值,并打印 import urllib.request import json import xlrd ...
- python一些实用的小工具
1 搭一个简易的本地局域网 python -m http.server 2 获取当前目录下的所有文件名 3 进度条效果 import sys,time for i in range(50): sy ...
随机推荐
- Debian 7 安装使用 Virtualbox及增强功能
一.安装virtualbox 可以从源里安装 sudo apt-get install virtualbox 也可以下载最新版安装 https://www.virtualbox.org/wiki/Do ...
- 关于修改Eclipse工作空间对应的文件夹名称之后的处理.
把文件夹名字从"xhkong"变成"xhkong(maintenance5.6)"之后打开这个工作空间. 导入git仓库我发现了一个之前没有发现的小技巧. 导入 ...
- Java Concurrency - wait & notify, 等待通知机制
生产者消费者问题是一个常见的多线程同步案例:一组生产者线程和一组消费者线程共享一个初始状态为空.大小为 N 的缓冲区.只有当缓冲区没满的时候,生产者才能把消息放入缓冲区,否则必须等待:只有缓冲区不空的 ...
- Android报错:The content of the adapter has changed...与Channel is unrecoverably broken and will be disposed的分析与解决办法
在Android中adapter错误: The content of the adapter has changed but ListView did not receive a notificati ...
- request常用方法小结
HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求头中的所有信息都封装在这个对象中,开发人员通过这个对象的方法,可以获得客户这些信息. req ...
- jQuery中ajax应用
一:Ajax介绍 1.ajax的定义:客服端js所发起的http请求的代号,无刷新的数据更新. 2.ajax原理: 运用XHTML+CSS来表达信息,运用javascript操作DOM(Documen ...
- C++ Iterator迭代器介绍及Iterator迭代器用法代码举例
C++ Iterator迭代器介绍 迭代器可被用来访问一个容器类的所包函的全部元素,其行为像一个指针.举一个例子,你可用一个迭代器来实现对vector容器中所含元素的遍历.有这么几种迭代器如下: 迭代 ...
- 解决TextView在显示文字的时候,一行还没显示满就跳到下一行
转载请注明:转自 http://blog.csdn.NET/u011176685/article/details/48295185 一.问题描述: Android的TextView在显示文字的时候,如 ...
- java匹配中文汉字的正则表达式
正则表达式匹配中文先要了解中文的编码 代码如下 复制代码 [u4E00-u9FA5]汉字?[uFE30-uFFA0]全角字符 [u4E00-u9FA5]汉字?[uFE30-uFFA0]全角字符 匹配中 ...
- 利用google api生成二维码名片例子
二维条码/二维码可以分为堆叠式/行排式二维条码和矩阵式二维条码.堆叠式/行排式二维条码形态上是由多行短截的一维条码堆叠而成:矩阵式二维条码以矩阵的形式组成,在矩阵相应元素位置上用“点”表示二进制“1” ...