Update main_window.py
This commit is contained in:
@@ -7,6 +7,8 @@ import traceback
|
|||||||
import customtkinter as ctk
|
import customtkinter as ctk
|
||||||
import tkinter as tk
|
import tkinter as tk
|
||||||
from tkinter import filedialog, messagebox
|
from tkinter import filedialog, messagebox
|
||||||
|
from .role_library import RoleLibrary
|
||||||
|
from llm_adapters import create_llm_adapter
|
||||||
|
|
||||||
from config_manager import load_config, save_config, test_llm_config, test_embedding_config
|
from config_manager import load_config, save_config, test_llm_config, test_embedding_config
|
||||||
from utils import read_file, save_string_to_txt, clear_file_content
|
from utils import read_file, save_string_to_txt, clear_file_content
|
||||||
@@ -222,6 +224,87 @@ class NovelGeneratorGUI:
|
|||||||
if selected_dir:
|
if selected_dir:
|
||||||
self.filepath_var.set(selected_dir)
|
self.filepath_var.set(selected_dir)
|
||||||
|
|
||||||
|
def show_character_import_window(self):
|
||||||
|
"""显示角色导入窗口"""
|
||||||
|
import_window = ctk.CTkToplevel(self.master)
|
||||||
|
import_window.title("导入角色信息")
|
||||||
|
import_window.geometry("600x500")
|
||||||
|
import_window.transient(self.master) # 设置为父窗口的临时窗口
|
||||||
|
import_window.grab_set() # 保持窗口在顶层
|
||||||
|
|
||||||
|
# 主容器
|
||||||
|
main_frame = ctk.CTkFrame(import_window)
|
||||||
|
main_frame.pack(fill="both", expand=True, padx=10, pady=10)
|
||||||
|
|
||||||
|
# 滚动容器
|
||||||
|
scroll_frame = ctk.CTkScrollableFrame(main_frame)
|
||||||
|
scroll_frame.pack(fill="both", expand=True, padx=5, pady=5)
|
||||||
|
|
||||||
|
# 获取角色库路径
|
||||||
|
role_lib_path = os.path.join(self.filepath_var.get().strip(), "角色库")
|
||||||
|
self.selected_roles = [] # 存储选中的角色名称
|
||||||
|
|
||||||
|
# 动态加载角色分类
|
||||||
|
if os.path.exists(role_lib_path):
|
||||||
|
for category in os.listdir(role_lib_path):
|
||||||
|
category_path = os.path.join(role_lib_path, category)
|
||||||
|
if os.path.isdir(category_path):
|
||||||
|
# 添加分类标签
|
||||||
|
category_label = ctk.CTkLabel(scroll_frame, text=f"【{category}】", font=("Microsoft YaHei", 12, "bold"))
|
||||||
|
category_label.pack(anchor="w", pady=(10,5))
|
||||||
|
|
||||||
|
# 添加该分类下的角色
|
||||||
|
for role_file in os.listdir(category_path):
|
||||||
|
if role_file.endswith(".txt"):
|
||||||
|
role_name = os.path.splitext(role_file)[0]
|
||||||
|
# 检查是否已存在同名角色
|
||||||
|
if not any(name == role_name for _, name in self.selected_roles):
|
||||||
|
chk = ctk.CTkCheckBox(scroll_frame, text=role_name)
|
||||||
|
chk.pack(anchor="w", padx=20)
|
||||||
|
self.selected_roles.append((chk, role_name))
|
||||||
|
|
||||||
|
# 底部按钮框架
|
||||||
|
btn_frame = ctk.CTkFrame(main_frame)
|
||||||
|
btn_frame.pack(fill="x", pady=10)
|
||||||
|
|
||||||
|
# 选择按钮
|
||||||
|
def confirm_selection():
|
||||||
|
selected = [name for chk, name in self.selected_roles if chk.get() == 1]
|
||||||
|
self.char_inv_text.delete("0.0", "end")
|
||||||
|
self.char_inv_text.insert("0.0", ", ".join(selected))
|
||||||
|
import_window.destroy()
|
||||||
|
|
||||||
|
btn_confirm = ctk.CTkButton(btn_frame, text="选择", command=confirm_selection)
|
||||||
|
btn_confirm.pack(side="left", padx=20)
|
||||||
|
|
||||||
|
# 取消按钮
|
||||||
|
btn_cancel = ctk.CTkButton(btn_frame, text="取消", command=import_window.destroy)
|
||||||
|
btn_cancel.pack(side="right", padx=20)
|
||||||
|
|
||||||
|
def show_role_library(self):
|
||||||
|
save_path = self.filepath_var.get().strip()
|
||||||
|
if not save_path:
|
||||||
|
messagebox.showwarning("警告", "请先设置保存路径")
|
||||||
|
return
|
||||||
|
|
||||||
|
# 初始化LLM适配器
|
||||||
|
llm_adapter = create_llm_adapter(
|
||||||
|
interface_format=self.interface_format_var.get(),
|
||||||
|
base_url=self.base_url_var.get(),
|
||||||
|
model_name=self.model_name_var.get(),
|
||||||
|
api_key=self.api_key_var.get(),
|
||||||
|
temperature=self.temperature_var.get(),
|
||||||
|
max_tokens=self.max_tokens_var.get(),
|
||||||
|
timeout=self.timeout_var.get()
|
||||||
|
)
|
||||||
|
|
||||||
|
# 传递LLM适配器实例到角色库
|
||||||
|
if hasattr(self, '_role_lib'):
|
||||||
|
if self._role_lib.window and self._role_lib.window.winfo_exists():
|
||||||
|
self._role_lib.window.destroy()
|
||||||
|
|
||||||
|
self._role_lib = RoleLibrary(self.master, save_path, llm_adapter) # 新增参数
|
||||||
|
|
||||||
# ----------------- 将导入的各模块函数直接赋给类方法 -----------------
|
# ----------------- 将导入的各模块函数直接赋给类方法 -----------------
|
||||||
generate_novel_architecture_ui = generate_novel_architecture_ui
|
generate_novel_architecture_ui = generate_novel_architecture_ui
|
||||||
generate_chapter_blueprint_ui = generate_chapter_blueprint_ui
|
generate_chapter_blueprint_ui = generate_chapter_blueprint_ui
|
||||||
|
|||||||
Reference in New Issue
Block a user