利用Python的tkinter模块实现界面化的批量修改文件名
作者:gc_2299 发布时间:2023-08-30 20:45:15
用Python编写过批量修改文件名的脚本程序,代码很简单,运行也比较快,唯一美中不足之处是每次批量修改文件名时都需要执行以下步骤:
1)复制文件夹路径;
2)打开脚本程序
3)替换脚本中的文件夹路径
4)保存脚本程序
5)执行脚本程序
为了便于操作,最好还是弄成GUI界面,手动选择文件夹,这样程序也更通用。Python中的GUI库很多,绝大部分都支持跨平台,其中安装python时自带的GUI库是tkinter,本文就学习并创建基于tkinte的批量修改文件名程序。
本文涉及的知识点包括以下几个:
1)使用tkinter.Tk创建窗口,并且调用geometry函数设置窗口的宽和高,需要注意的是geometry函数接收的是字符串,宽度x高度,中间的乘号其实是小写的x,用数学符号或者是大写的X会报错;
2)布局方式:根据参考文献1,tkinter有pack、grid、place三种布局方式,本文采购grid布局方式,该方式有点类似Winfom中的TableLayoutPanel,不同之处在于不用提前设置好行数和列数,只需指定所用控件的行号和列号即可;
3)控件,主要使用了标签(tkinter.Label)、文本(tkinter.Entry)、按钮(tkinter.Button)控件,tkinte通过变量绑定的方式获取或更新文本控件的值。
4)浏览文件夹,根据参考文献2,调用tkinter.filedialog中的askdirectory()选择文件夹。
全部代码如下所示:
# coding=gbk
import tkinter as tk
import os
from tkinter.filedialog import askdirectory
def BrowseDri():
txtDirPath.set(askdirectory())
def BatchReplaceFileName():
path = txtDirPath.get()
strSign=txtRemovedContent.get()
files=os.listdir(path)
for onefile in files:
if onefile.find(strSign)<0:
continue
oldname=path+"\\"+onefile
newname=path+"\\"+onefile.replace(strSign,"")
os.rename(oldname,newname)
print(oldname,"====>",newname)
window=tk.Tk()
window.title('批量处理文件名')
window.geometry('600x400')
tk.Label(window,text='选择文件夹').grid(row=0,column=0)
txtDirPath=tk.StringVar()
tk.Entry(window,textvariable=txtDirPath).grid(row=0,column=1)
tk.Button(window,text='浏览',command=BrowseDri).grid(row=0,column=2)
tk.Label(window,text='输入要移除的内容:').grid(row=1,column=0)
txtRemovedContent=tk.StringVar()
tk.Entry(window,textvariable=txtRemovedContent).grid(row=1,column=1)
tk.Button(window,text='移除',command=BatchReplaceFileName).grid(row=1,column=2)
tk.mainloop()
最后是程序运行效果,如下面几张截图所示:运行程序后,首先选择要批量处理的文件夹,然后设置文件名中要移除的内容,最后点击移除按钮批量处理文件名。
上文主要实现了批量移除文件名中的指定字符串,无法进行替换,本文在前面工作的基础上,增加批量替换文件名中指定字符串的功能。
新增的功能点不多,主要包括:
单选框控件:使用tkinter.Radiobutton函数创建单选框控件,并用value属性设置单选框对应的值,也即选中单选框时得到的值,提前定义好变量(本文中定义了Int变量),创建单选框控件时用variable属性绑定变量。如果要设置默认选中的单选框,则直接设置变量值为指定单选框对应的value值即可;
设置文本框的默认状态:文本框使用state属性设置文本框的可用状态,包括normal/disabled,可以在创建Entry时指定文档框的state属性为disabled,则文本框默认不可用;
修改控件属性:除了在创建控件时指定属性值之外,在程序运行过程中修改控件属性有多种方式(详见参考文献5),本文采用通过字典键设置属性方式动态修改文本框的可用状态。
批量修改文件名程序的完整代码如所示:
# coding=gbk
import tkinter as tk
import os
from tkinter.filedialog import askdirectory
def BrowseDri():
txtDirPath.set(askdirectory())
def SetControlStatus():
mode=processMode.get()
if(mode==1):
txtRemoved['state'] = 'normal'
txtBeforeReplaced['state'] = 'disabled'
txtAfterReplaced['state'] = 'disabled'
btnProcess['text']='移除'
elif mode==2:
txtRemoved['state'] = 'disabled'
txtBeforeReplaced['state'] = "normal"
txtAfterReplaced['state'] = 'normal'
btnProcess['text']='替换'
def BatchReplaceFileName():
path = txtDirPath.get()
mode=processMode.get()
if(mode==1):
strOldSign=txtRemovedContent.get()
strNewSign=""
elif mode==2:
strOldSign=txtBeforeReplactContent.get()
strNewSign=txtAfterReplactContent.get()
files=os.listdir(path)
for onefile in files:
if onefile.find(strOldSign)<0:
continue
oldname=path+"\\"+onefile
newname=path+"\\"+onefile.replace(strOldSign,strNewSign)
os.rename(oldname,newname)
print(oldname,"====>",newname)
window=tk.Tk()
window.title('批量处理文件名')
window.geometry('400x300')
tk.Label(window,text='选择文件夹').grid(row=0,column=0)
txtDirPath=tk.StringVar()
tk.Entry(window,textvariable=txtDirPath).grid(row=0,column=1)
tk.Button(window,text='浏览',command=BrowseDri).grid(row=0,column=2)
processMode =tk.IntVar()
tk.Radiobutton(window, text="移除内容", variable=processMode, value=1, command=SetControlStatus).grid(row=1,column=0)
tk.Label(window,text='输入要移除的内容:').grid(row=1,column=1)
txtRemovedContent=tk.StringVar()
txtRemoved=tk.Entry(window,textvariable=txtRemovedContent)
txtRemoved.grid(row=1,column=2)
tk.Radiobutton(window, text="替换内容", variable=processMode, value=2, command=SetControlStatus).grid(row=2,column=0)
tk.Label(window,text='输入替换前的内容:').grid(row=2,column=1)
txtBeforeReplactContent=tk.StringVar()
txtBeforeReplaced=tk.Entry(window,textvariable=txtBeforeReplactContent,state='disabled')
txtBeforeReplaced.grid(row=2,column=2)
tk.Label(window,text='输入替换后的内容:').grid(row=3,column=1)
txtAfterReplactContent=tk.StringVar()
txtAfterReplaced=tk.Entry(window,textvariable=txtAfterReplactContent,state='disabled')
txtAfterReplaced.grid(row=3,column=2)
processMode.set(1)
btnProcess=tk.Button(window,text='移除',command=BatchReplaceFileName)
btnProcess.grid(row=4,column=0)
tk.mainloop()
最后是程序效果,如下图所示,选择指定文件夹,首先将文件夹中所有文件中的car字符串替换为che@,接着再移除文件名中的@字符。
来源:https://blog.csdn.net/gc_2299/article/details/126443393


猜你喜欢
- 要判断自定义对象的类型,用__class__方法,或者用isinstance(object, class-or-type-or-tuple)
- 本文实例为大家分享了python tornado微信开发的具体代码,供大家参考,具体内容如下#微信入门代码#!/usr/bin/env py
- 本文实例讲述了MySQL学习笔记之数据定义表约束,分页方法。分享给大家供大家参考,具体如下:1. primary key 主键特点:主键是用
- virtualenv简介在开发Python应用程序的时候,我们的系统上通常只会安装一个Python版本:例如 3.7。所有使用 pip 安装
- 先给大家说下什么是localstorage前几天在老项目中发现有对cookie的操作觉得很奇怪,咨询下来是要缓存一些信息,以避免在URL上面
- 看这个模块要先看with as的用法,最常用的方法就是打开一个文件:with open(“filename”) as f:f.read()w
- 编写兼容IE和FireFox的脚本确定的件很烦人的事,今日又经历了一次。一、正式表达式问题试图用以下表达式提取中括号“]”后面的内容,连接调
- 一、HACK以下两种方法几乎能解决现今所有HACK。1, !important 随着IE7对!important的支持, !imp
- 我想让一片文章,每到3000字就分到下一条插入到数据库,求高手 <%Dim Content Conte
- 知识点: 1、拼接SQL 2、UNION ALL 3、EXEC 其代码如下: 代码如下:--测试示例 declare @sql
- PDO::lastInsertIdPDO::lastInsertId — 返回最后插入行的ID或序列值(PHP 5 >= 5.1.0,
- Math概述Math 对象不是构造函数,它具有数学常数和函数的属性和方法。跟数学相关的运算(求绝对值,取整、最大值等)可以使用 Math 中
- 如果不小心按到键盘上的Insert键的话,光标显示的就不是一条竖线,而是一个类似方块的阴影区域,比如插入一下insert键的介绍:它叫插入键
- 在Python中是没有Switch / Case语句的,很多人认为这种语句不够优雅灵活,在Python中用字典来处理多条件匹配问题字典会更简
- 前言Yolov5比较Yolov4,Yolov3等其他识别框架,速度快,代码结构简单,识别效率高,对硬件要求比较低。这篇博客针对Python+
- python 里有一个 threading 模块,其中提供了一个函数:threading.Thread(target=function, a
- 我就废话不多说了,直接上代码吧!#!/usr/bin/env python# coding:UTF-8"""@
- 游戏资源包的创建、修改、读取等操作。注意:资源包为游戏等需要快速读取的场景使用,所以并未对文件进行分块操作,都是一整个读取压缩的,所以需要自
- python中自定义模块导入路径的方式主要有以下3种:(1)使用sys.path.append()随着程序执行,会动态地添加模块导入的路径,
- 我希望大家看到该标题就能让想象到它的功能: 1、WITH TEMPL