更改角色库显示字体
This commit is contained in:
+72
-51
@@ -11,6 +11,8 @@ from utils import read_file, save_string_to_txt # 导入 utils 中的函数
|
||||
from novel_generator.common import invoke_with_cleaning # 新增导入
|
||||
from prompt_definitions import Character_Import_Prompt
|
||||
|
||||
DEFAULT_FONT = ("Microsoft YaHei", 12)
|
||||
|
||||
class RoleLibrary:
|
||||
def __init__(self, master, save_path, llm_adapter): # 新增llm_adapter参数
|
||||
self.master = master
|
||||
@@ -85,13 +87,14 @@ class RoleLibrary:
|
||||
category_frame.pack(fill="x", padx=5, pady=5)
|
||||
|
||||
# 分类选择标签
|
||||
ctk.CTkLabel(category_frame, text="分类选择").pack(side="left", padx=(0, 5))
|
||||
ctk.CTkLabel(category_frame, text="分类选择", font=DEFAULT_FONT).pack(side="left", padx=(0, 5))
|
||||
|
||||
# 分类选择框
|
||||
self.category_combobox = ctk.CTkComboBox(
|
||||
category_frame,
|
||||
values=self._get_all_categories(),
|
||||
width=200
|
||||
width=200,
|
||||
font=DEFAULT_FONT
|
||||
)
|
||||
self.category_combobox.pack(side="left", padx=0)
|
||||
|
||||
@@ -100,7 +103,8 @@ class RoleLibrary:
|
||||
category_frame,
|
||||
text="保存分类",
|
||||
width=80,
|
||||
command=self._move_to_category
|
||||
command=self._move_to_category,
|
||||
font=DEFAULT_FONT
|
||||
)
|
||||
self.save_category_btn.pack(side="left", padx=(0, 5))
|
||||
|
||||
@@ -110,7 +114,8 @@ class RoleLibrary:
|
||||
text="打开文件夹",
|
||||
width=80,
|
||||
command=lambda: os.startfile(
|
||||
os.path.join(self.save_path, self.category_combobox.get()))
|
||||
os.path.join(self.save_path, self.category_combobox.get())),
|
||||
font=DEFAULT_FONT
|
||||
).pack(side="left", padx=0)
|
||||
|
||||
# 角色名编辑行
|
||||
@@ -118,14 +123,15 @@ class RoleLibrary:
|
||||
name_frame.pack(fill="x", padx=5, pady=5)
|
||||
|
||||
# 角色名称标签
|
||||
ctk.CTkLabel(name_frame, text="角色名称").pack(side="left", padx=(0, 5))
|
||||
ctk.CTkLabel(name_frame, text="角色名称", font=DEFAULT_FONT).pack(side="left", padx=(0, 5))
|
||||
|
||||
self.role_name_var = tk.StringVar()
|
||||
self.role_name_entry = ctk.CTkEntry(
|
||||
name_frame,
|
||||
textvariable=self.role_name_var,
|
||||
placeholder_text="角色名称",
|
||||
width=200
|
||||
width=200,
|
||||
font=DEFAULT_FONT
|
||||
)
|
||||
self.role_name_entry.pack(side="left", padx=0)
|
||||
|
||||
@@ -133,14 +139,16 @@ class RoleLibrary:
|
||||
name_frame,
|
||||
text="修改",
|
||||
width=60,
|
||||
command=self._rename_role_file
|
||||
command=self._rename_role_file,
|
||||
font=DEFAULT_FONT
|
||||
).pack(side="left", padx=(0, 5))
|
||||
|
||||
ctk.CTkButton(
|
||||
name_frame,
|
||||
text="新增",
|
||||
width=60,
|
||||
command=lambda: self._create_new_role("全部")
|
||||
command=lambda: self._create_new_role("全部"),
|
||||
font=DEFAULT_FONT
|
||||
).pack(side="left", padx=0)
|
||||
|
||||
# 属性编辑区(基础框架)
|
||||
@@ -153,11 +161,11 @@ class RoleLibrary:
|
||||
button_frame.pack(fill="x", padx=5, pady=5)
|
||||
|
||||
ctk.CTkButton(button_frame, text="导入角色",
|
||||
command=self.import_roles).pack(side="left", padx=5)
|
||||
command=self.import_roles, font=DEFAULT_FONT).pack(side="left", padx=5)
|
||||
ctk.CTkButton(button_frame, text="删除",
|
||||
command=self.delete_current_role).pack(side="left", padx=5)
|
||||
command=self.delete_current_role, font=DEFAULT_FONT).pack(side="left", padx=5)
|
||||
ctk.CTkButton(button_frame, text="保存",
|
||||
command=self.save_current_role).pack(side="left", padx=5)
|
||||
command=self.save_current_role, font=DEFAULT_FONT).pack(side="left", padx=5)
|
||||
|
||||
def _get_all_categories(self):
|
||||
"""获取所有有效分类(包括动态更新)"""
|
||||
@@ -289,7 +297,7 @@ class RoleLibrary:
|
||||
right_panel.grid_columnconfigure(0, weight=1)
|
||||
|
||||
# 创建初始可编辑文本框
|
||||
text_box = ctk.CTkTextbox(right_panel, wrap="word")
|
||||
text_box = ctk.CTkTextbox(right_panel, wrap="word", font=DEFAULT_FONT)
|
||||
text_box.grid(row=0, column=0, sticky="nsew", padx=5, pady=5)
|
||||
text_box.configure(state="normal") # 保持可编辑状态
|
||||
|
||||
@@ -305,7 +313,8 @@ class RoleLibrary:
|
||||
btn_frame,
|
||||
text="导入临时角色库",
|
||||
width=120,
|
||||
command=lambda: self.confirm_import(import_window)
|
||||
command=lambda: self.confirm_import(import_window),
|
||||
font=DEFAULT_FONT
|
||||
).pack(side="left", padx=10)
|
||||
|
||||
# 分析文件按钮
|
||||
@@ -313,7 +322,8 @@ class RoleLibrary:
|
||||
btn_frame,
|
||||
text="分析文件",
|
||||
width=100,
|
||||
command=lambda: self.analyze_character_state(right_panel, left_panel)
|
||||
command=lambda: self.analyze_character_state(right_panel, left_panel),
|
||||
font=DEFAULT_FONT
|
||||
).pack(side="left", padx=10)
|
||||
|
||||
# 加载character_state.txt按钮
|
||||
@@ -321,7 +331,8 @@ class RoleLibrary:
|
||||
btn_frame,
|
||||
text="加载character_state.txt",
|
||||
width=160,
|
||||
command=lambda: self.load_default_character_state(right_panel)
|
||||
command=lambda: self.load_default_character_state(right_panel),
|
||||
font=DEFAULT_FONT
|
||||
).pack(side="right", padx=10)
|
||||
|
||||
# 从文件导入按钮
|
||||
@@ -329,7 +340,8 @@ class RoleLibrary:
|
||||
btn_frame,
|
||||
text="从文件导入",
|
||||
width=100,
|
||||
command=lambda: self.import_from_file(right_panel)
|
||||
command=lambda: self.import_from_file(right_panel),
|
||||
font=DEFAULT_FONT
|
||||
).pack(side="right", padx=10)
|
||||
|
||||
# 设置内容区权重
|
||||
@@ -407,17 +419,18 @@ class RoleLibrary:
|
||||
|
||||
# 勾选框
|
||||
var = BooleanVar(value=True)
|
||||
cb = ctk.CTkCheckBox(frame, text="", variable=var, width=20)
|
||||
cb = ctk.CTkCheckBox(frame, text="", variable=var, width=20, font=DEFAULT_FONT)
|
||||
cb.pack(side="left", padx=5)
|
||||
|
||||
# 角色名称
|
||||
lbl = ctk.CTkLabel(frame, text=role_name,
|
||||
font=("Microsoft YaHei", 11, "bold"))
|
||||
font=("Microsoft YaHei", 12))
|
||||
lbl.pack(side="left", padx=5)
|
||||
|
||||
# 属性摘要
|
||||
attrs = [f"{k}({len(v)})" for k,v in attributes.items()]
|
||||
summary = ctk.CTkLabel(frame, text=" | ".join(attrs),
|
||||
font=("Microsoft YaHei", 12),
|
||||
text_color="gray")
|
||||
summary.pack(side="right", padx=10)
|
||||
|
||||
@@ -430,9 +443,9 @@ class RoleLibrary:
|
||||
btn_frame = ctk.CTkFrame(scroll_frame)
|
||||
btn_frame.pack(fill="x", pady=5)
|
||||
ctk.CTkButton(btn_frame, text="全选",
|
||||
command=lambda: self._toggle_all(True)).pack(side="left")
|
||||
command=lambda: self._toggle_all(True), font=DEFAULT_FONT).pack(side="left")
|
||||
ctk.CTkButton(btn_frame, text="取消选择",
|
||||
command=lambda: self._toggle_all(False)).pack(side="left")
|
||||
command=lambda: self._toggle_all(False), font=DEFAULT_FONT).pack(side="left")
|
||||
|
||||
def _parse_temp_role_file(self, file_path):
|
||||
"""解析临时角色文件"""
|
||||
@@ -532,17 +545,18 @@ class RoleLibrary:
|
||||
|
||||
# 勾选框
|
||||
var = BooleanVar(value=True)
|
||||
cb = ctk.CTkCheckBox(frame, text="", variable=var, width=20)
|
||||
cb = ctk.CTkCheckBox(frame, text="", variable=var, width=20, font=DEFAULT_FONT)
|
||||
cb.pack(side="left", padx=5)
|
||||
|
||||
# 角色名称标签
|
||||
lbl = ctk.CTkLabel(frame, text=role['name'],
|
||||
font=("Microsoft YaHei", 11, "bold"))
|
||||
font=("Microsoft YaHei", 12))
|
||||
lbl.pack(side="left", padx=5)
|
||||
|
||||
# 属性摘要
|
||||
attrs = [f"{k}({len(v)})" for k,v in role['attributes'].items()]
|
||||
summary = ctk.CTkLabel(frame, text=" | ".join(attrs),
|
||||
font=("Microsoft YaHei", 12),
|
||||
text_color="gray")
|
||||
summary.pack(side="right", padx=10)
|
||||
|
||||
@@ -556,9 +570,9 @@ class RoleLibrary:
|
||||
btn_frame.pack(fill="x", pady=5)
|
||||
|
||||
ctk.CTkButton(btn_frame, text="全选",
|
||||
command=lambda: self._toggle_all(True)).pack(side="left")
|
||||
command=lambda: self._toggle_all(True), font=DEFAULT_FONT).pack(side="left")
|
||||
ctk.CTkButton(btn_frame, text="反选",
|
||||
command=lambda: self._toggle_all(False)).pack(side="left")
|
||||
command=lambda: self._toggle_all(False), font=DEFAULT_FONT).pack(side="left")
|
||||
|
||||
def _toggle_all(self, select):
|
||||
"""全选/反选操作"""
|
||||
@@ -636,7 +650,7 @@ class RoleLibrary:
|
||||
break
|
||||
|
||||
if not text_box:
|
||||
text_box = ctk.CTkTextbox(right_panel, wrap="word")
|
||||
text_box = ctk.CTkTextbox(right_panel, wrap="word", font=DEFAULT_FONT)
|
||||
text_box.grid(row=0, column=0, sticky="nsew", padx=5, pady=5)
|
||||
|
||||
text_box.configure(state="normal")
|
||||
@@ -669,8 +683,8 @@ class RoleLibrary:
|
||||
error_window.grab_set()
|
||||
|
||||
# 窗口内容
|
||||
ctk.CTkLabel(error_window, text="请至少选择一个角色").pack(padx=20, pady=10)
|
||||
ctk.CTkButton(error_window, text="确定", command=error_window.destroy).pack(pady=10)
|
||||
ctk.CTkLabel(error_window, text="请至少选择一个角色", font=DEFAULT_FONT).pack(padx=20, pady=10)
|
||||
ctk.CTkButton(error_window, text="确定", command=error_window.destroy, font=DEFAULT_FONT).pack(pady=10)
|
||||
|
||||
# 窗口居中
|
||||
error_window.update_idletasks()
|
||||
@@ -990,11 +1004,12 @@ class RoleLibrary:
|
||||
# 操作提示
|
||||
ctk.CTkLabel(category_frame,
|
||||
text="右键分类名即可重命名",
|
||||
font=("Microsoft YaHei", 10),
|
||||
font=DEFAULT_FONT,
|
||||
text_color="gray").pack(side="top", anchor="w", padx=5)
|
||||
|
||||
# 固定按钮
|
||||
ctk.CTkButton(category_frame, text="全部", width=50,
|
||||
font=("Microsoft YaHei", 12),
|
||||
command=lambda: self.show_category("全部")).pack(side="left", padx=2)
|
||||
|
||||
# 滚动分类区
|
||||
@@ -1004,9 +1019,9 @@ class RoleLibrary:
|
||||
|
||||
# 操作按钮
|
||||
ctk.CTkButton(category_frame, text="新增", width=50,
|
||||
command=self.add_category).pack(side="right", padx=2)
|
||||
command=self.add_category, font=DEFAULT_FONT).pack(side="right", padx=2)
|
||||
ctk.CTkButton(category_frame, text="删除", width=50,
|
||||
command=self.delete_category).pack(side="right", padx=2)
|
||||
command=self.delete_category, font=DEFAULT_FONT).pack(side="right", padx=2)
|
||||
|
||||
self.load_categories()
|
||||
|
||||
@@ -1032,7 +1047,7 @@ class RoleLibrary:
|
||||
if os.path.isdir(os.path.join(self.save_path, d)) and d != "全部"]
|
||||
|
||||
for category in categories:
|
||||
btn = ctk.CTkButton(self.scroll_frame, text=category, width=80)
|
||||
btn = ctk.CTkButton(self.scroll_frame, text=category, width=80, font=DEFAULT_FONT)
|
||||
btn.bind("<Button-1>", lambda e, c=category: self.show_category(c))
|
||||
btn.bind("<Button-3>", lambda e, c=category: self.rename_category(c))
|
||||
btn.pack(side="left", padx=2)
|
||||
@@ -1079,7 +1094,7 @@ class RoleLibrary:
|
||||
|
||||
for cat in categories:
|
||||
var = tk.BooleanVar()
|
||||
chk = ctk.CTkCheckBox(scroll_frame, text=cat, variable=var)
|
||||
chk = ctk.CTkCheckBox(scroll_frame, text=cat, variable=var, font=DEFAULT_FONT)
|
||||
chk.pack(anchor="w")
|
||||
self.selected_del.append((cat, var))
|
||||
|
||||
@@ -1088,9 +1103,9 @@ class RoleLibrary:
|
||||
btn_frame.pack(fill="x", pady=5)
|
||||
|
||||
ctk.CTkButton(btn_frame, text="删除选中",
|
||||
command=lambda: self.confirm_delete(del_window)).pack(side="left", padx=5)
|
||||
command=lambda: self.confirm_delete(del_window), font=DEFAULT_FONT).pack(side="left", padx=5)
|
||||
ctk.CTkButton(btn_frame, text="取消",
|
||||
command=del_window.destroy).pack(side="right", padx=5)
|
||||
command=del_window.destroy, font=DEFAULT_FONT).pack(side="right", padx=5)
|
||||
|
||||
self.category_combobox.configure(values=self._get_all_categories())
|
||||
self.category_combobox.set("全部")
|
||||
@@ -1119,7 +1134,7 @@ class RoleLibrary:
|
||||
y = self.window.winfo_y() + (self.window.winfo_height() - c_height) // 2
|
||||
choice_window.geometry(f"+{x}+{y}")
|
||||
|
||||
ctk.CTkLabel(choice_window, text="请选择删除方式:").pack(pady=10)
|
||||
ctk.CTkLabel(choice_window, text="请选择删除方式:", font=DEFAULT_FONT).pack(pady=10)
|
||||
btn_frame = ctk.CTkFrame(choice_window)
|
||||
btn_frame.pack(pady=10)
|
||||
|
||||
@@ -1145,9 +1160,9 @@ class RoleLibrary:
|
||||
choice_window.destroy()
|
||||
|
||||
ctk.CTkButton(btn_frame, text="全部删除",
|
||||
command=lambda: perform_delete("all")).pack(side="left", padx=5)
|
||||
command=lambda: perform_delete("all"), font=DEFAULT_FONT).pack(side="left", padx=5)
|
||||
ctk.CTkButton(btn_frame, text="移动角色",
|
||||
command=lambda: perform_delete("move")).pack(side="left", padx=5)
|
||||
command=lambda: perform_delete("move"), font=DEFAULT_FONT).pack(side="left", padx=5)
|
||||
|
||||
def count_roles(self, categories):
|
||||
"""统计角色数量"""
|
||||
@@ -1185,7 +1200,8 @@ class RoleLibrary:
|
||||
btn = ctk.CTkButton(
|
||||
self.role_list_frame,
|
||||
text=role_name,
|
||||
command=lambda r=role_name: self.show_role(r)
|
||||
command=lambda r=role_name: self.show_role(r),
|
||||
font=DEFAULT_FONT
|
||||
)
|
||||
btn.pack(fill="x", pady=2)
|
||||
except FileNotFoundError:
|
||||
@@ -1200,7 +1216,8 @@ class RoleLibrary:
|
||||
btn = ctk.CTkButton(
|
||||
self.role_list_frame,
|
||||
text=role_name,
|
||||
command=lambda r=role_name: self.show_role(r)
|
||||
command=lambda r=role_name: self.show_role(r),
|
||||
font=DEFAULT_FONT
|
||||
)
|
||||
btn.pack(fill="x", pady=2)
|
||||
except FileNotFoundError:
|
||||
@@ -1294,9 +1311,9 @@ class RoleLibrary:
|
||||
self._create_attribute_section(attr_name, items)
|
||||
|
||||
except FileNotFoundError as e:
|
||||
messagebox.showerror("错误", f"文件不存在:{str(e)}", parent=self.window)
|
||||
messagebox.showerror("错误", f"文件不存在:{e}", parent=self.window)
|
||||
except Exception as e:
|
||||
messagebox.showerror("错误", f"读取文件失败:{str(e)}", parent=self.window)
|
||||
messagebox.showerror("错误", f"读取文件失败:{e}", parent=self.window)
|
||||
|
||||
def _create_attribute_section(self, attr_name, items):
|
||||
"""创建单个属性的编辑区域"""
|
||||
@@ -1309,7 +1326,7 @@ class RoleLibrary:
|
||||
attribute_block.grid_columnconfigure(1, weight=1) # 设置第二列权重
|
||||
|
||||
# 属性名称标签
|
||||
label = ctk.CTkLabel(attribute_block, text=attr_name)
|
||||
label = ctk.CTkLabel(attribute_block, text=attr_name, font=DEFAULT_FONT)
|
||||
label.grid(row=0, column=0, sticky="w", padx=(5, 10), pady=2)
|
||||
|
||||
# 第一个条目和“增加”按钮的容器
|
||||
@@ -1318,7 +1335,7 @@ class RoleLibrary:
|
||||
first_item_frame.grid_columnconfigure(0, weight=1)
|
||||
|
||||
# 第一个条目输入框
|
||||
first_entry = ctk.CTkEntry(first_item_frame)
|
||||
first_entry = ctk.CTkEntry(first_item_frame, font=DEFAULT_FONT)
|
||||
first_entry.grid(row=0, column=0, sticky="ew", padx=(0, 5), ipadx=5, ipady=3)
|
||||
if items:
|
||||
first_entry.insert(0, items[0]) # 填充第一个条目的内容
|
||||
@@ -1332,7 +1349,8 @@ class RoleLibrary:
|
||||
add_button_frame,
|
||||
text="+",
|
||||
width=30,
|
||||
command=lambda: self._add_item(attr_name)
|
||||
command=lambda: self._add_item(attr_name),
|
||||
font=DEFAULT_FONT
|
||||
)
|
||||
add_button.grid(row=0, column=0)
|
||||
|
||||
@@ -1365,7 +1383,7 @@ class RoleLibrary:
|
||||
item_frame.grid_columnconfigure(0, weight=1)
|
||||
|
||||
# 条目输入框
|
||||
new_entry = ctk.CTkEntry(item_frame)
|
||||
new_entry = ctk.CTkEntry(item_frame, font=DEFAULT_FONT)
|
||||
new_entry.grid(row=0, column=0, sticky="ew", padx=(0, 5), ipadx=5, ipady=3)
|
||||
new_entry.insert(0, initial_text) # 设置初始文本
|
||||
|
||||
@@ -1377,7 +1395,8 @@ class RoleLibrary:
|
||||
del_button_frame,
|
||||
text="-",
|
||||
width=30,
|
||||
command=lambda f=item_frame: self._remove_item(f, attr_name)
|
||||
command=lambda f=item_frame: self._remove_item(f, attr_name),
|
||||
font=DEFAULT_FONT
|
||||
)
|
||||
del_button.grid(row=0, column=0)
|
||||
|
||||
@@ -1468,14 +1487,16 @@ class RoleLibrary:
|
||||
content_frame.pack(fill="both", expand=True, padx=10, pady=10)
|
||||
|
||||
# 顶部提示
|
||||
ctk.CTkLabel(content_frame, text=f"当前分类:{old_name}").pack(pady=(10, 5))
|
||||
ctk.CTkLabel(content_frame, text=f"当前分类:{old_name}",
|
||||
font=DEFAULT_FONT).pack(pady=(10, 5))
|
||||
|
||||
# 输入框
|
||||
input_frame = ctk.CTkFrame(content_frame)
|
||||
input_frame.pack(fill="x", pady=5)
|
||||
ctk.CTkLabel(input_frame, text="新名称:").pack(side="left", padx=5)
|
||||
ctk.CTkLabel(input_frame, text="新名称:",
|
||||
font=DEFAULT_FONT).pack(side="left", padx=5)
|
||||
name_var = tk.StringVar()
|
||||
name_entry = ctk.CTkEntry(input_frame, textvariable=name_var, width=150)
|
||||
name_entry = ctk.CTkEntry(input_frame, textvariable=name_var, width=150, font=DEFAULT_FONT)
|
||||
name_entry.pack(side="left", padx=5)
|
||||
|
||||
# 按钮区
|
||||
@@ -1508,9 +1529,9 @@ class RoleLibrary:
|
||||
messagebox.showerror("错误", f"重命名失败:{str(e)}", parent=self.window)
|
||||
|
||||
ctk.CTkButton(button_frame, text="确认",
|
||||
command=confirm_rename).pack(side="left", padx=10)
|
||||
command=confirm_rename, font=DEFAULT_FONT).pack(side="left", padx=10)
|
||||
ctk.CTkButton(button_frame, text="取消",
|
||||
command=dialog.destroy).pack(side="right", padx=10)
|
||||
command=dialog.destroy, font=DEFAULT_FONT).pack(side="right", padx=10)
|
||||
|
||||
# 窗口居中
|
||||
dialog.update_idletasks()
|
||||
|
||||
Reference in New Issue
Block a user