批量改文件名小程序里的几个“坑”

(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;

扫描二维码关注公众号,回复: 11869358 查看本文章

#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上面的好心牛人,我的每一寸进步都离不开你们热心的帮助!

猜你喜欢

转载自blog.csdn.net/wokaoyan1981/article/details/104077108