(1)程序功能:运行后主窗口打开。点击Click Me按钮,应该弹出一个文件夹选择窗口,选择好文件夹点击确认后,将文件夹中的文件(不包括隐藏文件和子文件夹)的名称前面加上序号。在按钮下面显示已处理的文件数量。
图1 主窗口和子窗口效果
图2 批量重命名(文件名前添加了序号)的效果,注意第一个隐藏文件已经略过了。
(2)初始方案:
import os from tkinter import filedialog import tkinter as tk from tkinter import Button class ReName(): def __init__(self): self.n = 0 def rename(self): file_path = filedialog.askdirectory(title='ReNamer') file_lists = os.listdir(file_path) for file in file_lists.copy(): oldname = file_path + os.sep + file if os.path.isdir(oldname): continue else: newname = file_path + os.sep + '(' + str(self.n + 1) + ')' + file os.rename(oldname, newname) self.n+=1 print(self.n) ins=ReName() root=tk.Tk() root.geometry("550x200") label=tk.Label(root,font=("Arial Bold",15), text='Please select a directory to rename files in the folder:') label.pack() btn=Button(root,font=("Arial",15),bg='orange',text="Click Me",command=ins.rename()) btn.pack() print(ins.n) label=tk.Label(root,text=str(ins.n)+' file(s) renamed.') label.pack() root.mainloop()
(3)主要问题:主窗口没有显示Click Me按钮;主窗口和子窗口同时弹出;未筛除隐藏文件(macos下)
(4)修改后的方案:
import os from tkinter import filedialog import tkinter as tk from tkinter import Button import stat root=tk.Tk() class ReName(): def __init__(self): self.n = 0 #3 self.label1=tk.Label(root) def rename(self): file_path = filedialog.askdirectory(title='ReNamer') self.file_lists = os.listdir(file_path) for self.file in self.file_lists.copy(): self.oldname = file_path + os.sep + self.file if os.path.isdir(self.oldname) or self.file.startswith('.'): #4 continue else: self.newname = file_path + os.sep + '(' + str(self.n + 1) + ')' + self.file os.rename(self.oldname, self.newname) #5 self.n+=1 self.label1.config(text='{} file(s) renamed'.format(self.n)) #6 self.label1.pack() ins=ReName() root.geometry("550x200") label=tk.Label(root,font=("Arial Bold",15), text='Please select a directory to rename files in the folder:') label.pack() btn=Button(root,font=("Arial",15),bg='orange',text="Click Me",command=ins.rename) #1 #2 btn.pack() root.mainloop()
(5)心得:
#1 :
command=后面跟的是函数名,绝不可在末尾添加括号。这意味着并没有调用类ReName的rename方法,因此n永远等于初始值0;
#2:
button里面的command是点击触发动作的入口;
#3:
若要在方法外使用类的属性n,应该申明在def __init(self):里面,而不是在方法里,记得前面要加self.;
#4:
macos下判断隐藏文件的方法为startswith('.');
#5:
系统方法os.rename()的两个参数均需要全路径,只给出文件名文件名是不行的;
#6:
label.config(text='{} file(s) renamed'.format(self.n))的含义,还有别忘了配对的label.pack()
(6)后续功能:
考虑只允许点击Button一次,随后变为灰色disabled状态。
若以上内容有不足之处,请不吝指出。最后还要感谢图灵QQ群、csdn、思否和stackoverflow上面的好心牛人,我的每一寸进步都离不开你们热心的帮助!