import
os
import
tkinter as tk
from
tkinter
import
ttk, filedialog
from
PIL
import
Image, ImageTk
from
pathlib
import
Path
from
tkinter
import
ttk
class
UltraRenamer:
def
__init__(
self
, master):
self
.master
=
master
self
.master.title(
"极速批量重命名工具"
)
self
.master.geometry(
"1630x960"
)
self
.main_frame
=
ttk.Frame(
self
.master)
self
.main_frame.pack(fill
=
tk.BOTH, expand
=
True
)
self
.canvas
=
tk.Canvas(
self
.main_frame)
self
.scrollbar
=
ttk.Scrollbar(
self
.main_frame, orient
=
"vertical"
, command
=
self
.canvas.yview)
self
.scroll_frame
=
ttk.Frame(
self
.canvas)
self
.canvas.configure(yscrollcommand
=
self
.scrollbar.
set
)
self
.canvas.pack(side
=
tk.LEFT, fill
=
tk.BOTH, expand
=
True
)
self
.scrollbar.pack(side
=
tk.RIGHT, fill
=
tk.Y)
self
.canvas.create_window((
0
,
0
), window
=
self
.scroll_frame, anchor
=
"nw"
)
self
.toolbar
=
ttk.Frame(
self
.master)
self
.toolbar.pack(fill
=
tk.X, pady
=
3
)
ttk.Button(
self
.toolbar, text
=
"打开目录"
, command
=
self
.load_dir, width
=
10
).pack(side
=
tk.LEFT, padx
=
5
)
ttk.Button(
self
.toolbar, text
=
"执行重命名"
, command
=
self
.safe_rename, width
=
12
).pack(side
=
tk.LEFT)
ttk.Label(
self
.toolbar, text
=
"每行显示9个项目 | 点击输入框自动选中原名称"
, foreground
=
"#666"
).pack(side
=
tk.LEFT, padx
=
20
)
self
.file_data
=
[]
self
.thumb_refs
=
[]
self
.input_vars
=
[]
def
load_dir(
self
):
path
=
filedialog.askdirectory()
if
not
path:
return
for
widget
in
self
.scroll_frame.winfo_children():
widget.destroy()
self
.file_data.clear()
self
.input_vars.clear()
files
=
sorted
(Path(path).iterdir(), key
=
lambda
f: f.stat().st_mtime)
COLUMNS
=
14
thumb_size
=
80
item_width
=
1640
/
/
COLUMNS
-
15
for
idx,
file
in
enumerate
(files):
row
=
idx
/
/
COLUMNS
col
=
idx
%
COLUMNS
frame
=
ttk.Frame(
self
.scroll_frame, width
=
item_width)
frame.grid(row
=
row, column
=
col, padx
=
3
, pady
=
3
, sticky
=
"nsew"
)
img_label
=
ttk.Label(frame)
if
file
.suffix.lower()
in
Image.registered_extensions():
try
:
img
=
Image.
open
(
file
)
img.thumbnail((thumb_size, thumb_size))
tk_img
=
ImageTk.PhotoImage(img)
self
.thumb_refs.append(tk_img)
img_label.config(image
=
tk_img)
except
Exception as e:
img_label.config(text
=
"图片加载失败"
)
else
:
img_label.config(text
=
file
.suffix.upper()
+
"文件"
)
img_label.pack()
orig_name
=
ttk.Label(frame, text
=
file
.stem, wraplength
=
item_width
-
20
, font
=
(
'微软雅黑'
,
8
))
orig_name.pack(pady
=
2
)
input_var
=
tk.StringVar(value
=
file
.stem)
entry
=
ttk.Entry(frame, textvariable
=
input_var, width
=
14
, font
=
(
'微软雅黑'
,
9
))
entry.bind(
"<FocusIn>"
,
lambda
e: e.widget.select_range(
0
, tk.END))
entry.pack()
self
.input_vars.append((
file
, input_var))
self
.scroll_frame.update_idletasks()
self
.canvas.config(scrollregion
=
self
.canvas.bbox(
"all"
))
def
safe_rename(
self
):
name_map
=
{}
for
file
, var
in
self
.input_vars:
new_stem
=
var.get().strip()
if
not
new_stem
or
new_stem
=
=
file
.stem:
continue
base_name
=
new_stem
suffix
=
file
.suffix
counter
=
1
while
True
:
test_name
=
f
"{base_name}{suffix}"
if
counter
=
=
1
else
f
"{base_name}_{counter-1}{suffix}"
if
not
file
.with_name(test_name).exists():
break
counter
+
=
1
try
:
file
.rename(
file
.with_name(test_name))
name_map[
file
.name]
=
test_name
except
Exception as e:
tk.messagebox.showerror(
"错误"
, f
"重命名失败: {str(e)}"
)
return
if
name_map:
self
.load_dir()
tk.messagebox.showinfo(
"完成"
, f
"成功重命名 {len(name_map)} 个文件"
)
if
__name__
=
=
"__main__"
:
root
=
tk.Tk()
root.style
=
ttk.Style()
root.style.configure(
"TEntry"
, padding
=
3
)
app
=
UltraRenamer(root)
root.mainloop()