文件名称格式化工具介绍
功能概述
此工具是一个基于 Tkinter 的图形用户界面 (GUI) 应用程序,旨在帮助用户快速生成符合特定格式的文件名。它特别适用于需要对材质或模型文件进行重命名的场景。通过选择前缀和后缀,并输入自定义字符串,用户可以轻松生成符合规范的文件名,并将其复制到剪切板中。
主要功能
-
前缀选择:
- 用户可以从预定义的前缀列表中选择一个前缀。
- 前缀列表包括常见的材质和模型前缀,如 “SM_”(静态网格体)、“CH_”(角色)、“UI_”(用户界面)等。
-
字符串输入:
- 用户可以输入三个自定义字符串,这些字符串将被拼接在一起形成文件名的一部分。
- 每个字符串输入框都允许用户输入任意文本。
-
后缀选择:
- 用户可以从预定义的后缀列表中选择一个后缀。
- 后缀列表包括常见的材质属性后缀,如 “_BC”(Base color)、“_MT”(Metallic)、“_S”(Specular)等。
-
复制到剪切板:
- 用户点击“复制到剪切板”按钮后,程序会根据选择的前缀、输入的字符串和选择的后缀生成最终的文件名,并将其复制到剪切板中。
- 如果用户未输入任何字符串,程序会显示警告提示。
-
状态提示:
- 程序会在状态标签中显示操作结果,例如“已复制到剪切板”。
- 状态提示会在三秒后自动消失。
使用方法
-
启动程序:
- 运行脚本,程序将打开一个图形用户界面窗口。
-
选择前缀:
- 在“选择前缀”下拉菜单中选择一个前缀。
-
输入字符串:
- 在“输入字符串1”、“输入字符串2”和“输入字符串3”输入框中输入自定义字符串。
-
选择后缀:
- 在“选择后缀”下拉菜单中选择一个后缀。
-
复制到剪切板:
- 点击“复制到剪切板”按钮,生成的文件名将被复制到剪切板中。
-
查看状态:
- 程序会在状态标签中显示操作结果,例如“已复制到剪切板”。
技术细节
- Tkinter:用于创建图形用户界面。
- pyperclip:用于将生成的文件名复制到剪切板。
- re:用于处理前缀和后缀中的特殊字符。
示例
假设用户选择了前缀 “SM_”,输入了字符串 “MyModel” 和 “v1”,选择了后缀 “_BC”,则生成的文件名为 “SM_MyModelv1_BC”,并被复制到剪切板中。
注意事项
- 程序会自动去除前缀和后缀中的解释内容和“无”。
- 用户必须输入至少一个字符串,否则程序会显示警告提示。
希望这个工具能帮助您更高效地管理文件名!
以下为代码
前后缀可以根据您所需来自由修改(要避免使用英文括号,因为在这个脚本的代码的下拉菜单中,当将编辑好的内容复制到剪贴板中时会根据英文括号来去除注释文本)
import tkinter as tk
from tkinter import ttk, messagebox
import pyperclip
import re
def create_main_window():
root = tk.Tk()
root.title("文件名称格式化工具")
root.geometry("330x250") # 调整窗口大小
# 禁止调整窗口大小
root.resizable(False, False)
# 使内容横向居中
root.grid_columnconfigure(0, weight=1)
root.grid_columnconfigure(1, weight=1)
# 前缀选择
prefix_label = tk.Label(root, text="选择前缀:")
prefix_label.grid(row=0, column=0, padx=5, pady=5, sticky="e")
prefix_var = tk.StringVar()
prefix_var.set("无")
prefix_options = [
"无", "SM_(静态网格体)", "CH_(角色)", "UI_(用户界面)", "VH_(载具)", "WP_(武器)", "HDR_(HDRI)", "M_(材质)","T_(纹理贴图)",
]
prefix_combobox = ttk.Combobox(root, textvariable=prefix_var, values=prefix_options, state="readonly")
prefix_combobox.grid(row=0, column=1, padx=5, pady=5, sticky="w")
# 字符串输入部分
input_label_1 = tk.Label(root, text="输入字符串1:")
input_label_1.grid(row=1, column=0, padx=5, pady=5, sticky="e")
input_entry_1 = tk.Entry(root, width=20)
input_entry_1.grid(row=1, column=1, padx=5, pady=5, sticky="w")
input_label_2 = tk.Label(root, text="输入字符串2:")
input_label_2.grid(row=2, column=0, padx=5, pady=5, sticky="e")
input_entry_2 = tk.Entry(root, width=20)
input_entry_2.grid(row=2, column=1, padx=5, pady=5, sticky="w")
input_label_3 = tk.Label(root, text="输入字符串3:")
input_label_3.grid(row=3, column=0, padx=5, pady=5, sticky="e")
input_entry_3 = tk.Entry(root, width=20)
input_entry_3.grid(row=3, column=1, padx=5, pady=5, sticky="w")
# 后缀选择
suffix_label = tk.Label(root, text="选择后缀:")
suffix_label.grid(row=4, column=0, padx=5, pady=5, sticky="e")
suffix_var = tk.StringVar()
suffix_var.set("无")
suffix_options = [
"无", "_BC(Base color)", "_MT(Metallic)", "_S(Specular)", "_R(Roughness)", "_N(Normal)",
"_DP(Displacement)", "_AO(Ambient Occlusion)", "_H(Height Map", "_FM(Flow Map)", "_L(Light Map -fake)",
"_M(Mask)"
]
suffix_combobox = ttk.Combobox(root, textvariable=suffix_var, values=suffix_options, state="readonly")
suffix_combobox.grid(row=4, column=1, padx=5, pady=5, sticky="w")
# 提示标签
status_label = tk.Label(root, text="", fg="green")
status_label.grid(row=6, column=0, columnspan=2, padx=5, pady=5, sticky="ew")
# 复制到剪切板
def copy_to_clipboard():
prefix = prefix_var.get()
suffix = suffix_var.get()
input_str_1 = input_entry_1.get().strip()
input_str_2 = input_entry_2.get().strip()
input_str_3 = input_entry_3.get().strip()
if not any([input_str_1, input_str_2, input_str_3]):
messagebox.showwarning("警告", "请输入至少一个字符串")
return
# 去掉前后缀中的解释内容和“无”
prefix = re.sub(r"\(.*?\)|无", "", prefix).strip()
suffix = re.sub(r"\(.*?\)|无", "", suffix).strip()
# 构建最终字符串
final_string = f"{prefix}{input_str_1}{input_str_2}{input_str_3}{suffix}"
# 复制到剪切板
pyperclip.copy(final_string)
# 更新状态标签
status_label.config(text="已复制到剪切板")
# 三秒后清除状态标签
root.after(3000, lambda: status_label.config(text=""))
# 复制到剪切板按钮
copy_button = tk.Button(root, text="复制到剪切板", command=copy_to_clipboard)
copy_button.grid(row=5, column=0, columnspan=2, padx=5, pady=10, sticky="nsew")
return root
if __name__ == "__main__":
main_window = create_main_window()
main_window.mainloop()