Add files via upload
增加代理设置选项; 优化新版本google-generativeai 不支持 Client 类问题; 优化批量生成章节界面,使用customtkinter统一设计风格;
This commit is contained in:
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+85
-1
@@ -9,6 +9,8 @@ import customtkinter as ctk
|
||||
from config_manager import load_config, save_config
|
||||
from tooltips import tooltips
|
||||
|
||||
import os
|
||||
|
||||
|
||||
def create_label_with_help(self, parent, label_text, tooltip_key, row, column,
|
||||
font=None, sticky="e", padx=5, pady=5):
|
||||
@@ -45,11 +47,17 @@ def build_config_tabview(self):
|
||||
self.embeddings_config_tab = self.config_tabview.add("Embedding settings")
|
||||
self.config_choose = self.config_tabview.add("Config choose")
|
||||
|
||||
# PenBo 增加代理功能支持
|
||||
self.proxy_setting_tab = self.config_tabview.add("Proxy setting")
|
||||
|
||||
|
||||
build_ai_config_tab(self)
|
||||
build_embeddings_config_tab(self)
|
||||
build_config_choose_tab(self)
|
||||
|
||||
# PenBo 增加代理功能支持
|
||||
build_proxy_setting_tab(self)
|
||||
|
||||
def build_ai_config_tab(self):
|
||||
def refresh_config_dropdown():
|
||||
"""刷新配置下拉菜单"""
|
||||
@@ -607,11 +615,87 @@ def build_config_choose_tab(self):
|
||||
|
||||
|
||||
|
||||
# PenBo 增加代理功能支持
|
||||
def build_proxy_setting_tab(self):
|
||||
# 代理设置标签页布局
|
||||
for i in range(5):
|
||||
self.proxy_setting_tab.grid_rowconfigure(i, weight=0)
|
||||
self.proxy_setting_tab.grid_columnconfigure(0, weight=0)
|
||||
self.proxy_setting_tab.grid_columnconfigure(1, weight=1)
|
||||
|
||||
# 从配置文件加载代理设置
|
||||
config_data = load_config(self.config_file)
|
||||
proxy_setting = config_data.get("proxy_setting", {})
|
||||
|
||||
# 代理启用开关
|
||||
create_label_with_help(self, self.proxy_setting_tab, "启用代理:", "proxy_enabled", 0, 0)
|
||||
self.proxy_enabled_var = ctk.BooleanVar(value=proxy_setting.get("enabled", False))
|
||||
proxy_enabled_switch = ctk.CTkSwitch(
|
||||
self.proxy_setting_tab,
|
||||
text="",
|
||||
variable=self.proxy_enabled_var,
|
||||
onvalue=True,
|
||||
offvalue=False,
|
||||
font=("Microsoft YaHei", 12)
|
||||
)
|
||||
proxy_enabled_switch.grid(row=0, column=1, padx=5, pady=5, sticky="w")
|
||||
|
||||
# 地址输入框
|
||||
create_label_with_help(self, self.proxy_setting_tab, "地址:", "proxy_address", 1, 0)
|
||||
self.proxy_address_var = ctk.StringVar(value=proxy_setting.get("proxy_url", "127.0.0.1"))
|
||||
proxy_address_entry = ctk.CTkEntry(
|
||||
self.proxy_setting_tab,
|
||||
textvariable=self.proxy_address_var,
|
||||
font=("Microsoft YaHei", 12)
|
||||
)
|
||||
proxy_address_entry.grid(row=1, column=1, padx=5, pady=5, sticky="nsew")
|
||||
|
||||
# 端口输入框
|
||||
create_label_with_help(self, self.proxy_setting_tab, "端口:", "proxy_port", 2, 0)
|
||||
self.proxy_port_var = ctk.StringVar(value=proxy_setting.get("proxy_port", "10809"))
|
||||
proxy_port_entry = ctk.CTkEntry(
|
||||
self.proxy_setting_tab,
|
||||
textvariable=self.proxy_port_var,
|
||||
font=("Microsoft YaHei", 12)
|
||||
)
|
||||
proxy_port_entry.grid(row=2, column=1, padx=5, pady=5, sticky="nsew")
|
||||
|
||||
|
||||
def open_proxy(address, port):
|
||||
"""启动代理"""
|
||||
# 设置环境变量
|
||||
os.environ['HTTP_PROXY'] = f"http://{address}:{port}"
|
||||
os.environ['HTTPS_PROXY'] = f"http://{address}:{port}"
|
||||
|
||||
def save_proxy_setting():
|
||||
config_data = load_config(self.config_file)
|
||||
if "proxy_setting" not in config_data:
|
||||
config_data["proxy_setting"] = {}
|
||||
|
||||
config_data["proxy_setting"]["enabled"] = self.proxy_enabled_var.get()
|
||||
config_data["proxy_setting"]["proxy_url"] = self.proxy_address_var.get()
|
||||
config_data["proxy_setting"]["proxy_port"] = self.proxy_port_var.get()
|
||||
|
||||
save_config(config_data, self.config_file)
|
||||
messagebox.showinfo("提示", "代理配置已保存。")
|
||||
|
||||
if self.proxy_enabled_var.get():
|
||||
open_proxy(self.proxy_address_var.get(), self.proxy_port_var.get())
|
||||
else:
|
||||
os.environ.pop('HTTP_PROXY', None)
|
||||
os.environ.pop('HTTPS_PROXY', None)
|
||||
|
||||
# 添加保存按钮
|
||||
save_btn = ctk.CTkButton(
|
||||
self.proxy_setting_tab,
|
||||
text="保存代理设置",
|
||||
command=save_proxy_setting,
|
||||
font=("Microsoft YaHei", 12)
|
||||
)
|
||||
save_btn.grid(row=3, column=0, columnspan=2, padx=5, pady=5, sticky="ew")
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
def load_config_btn(self):
|
||||
cfg = load_config(self.config_file)
|
||||
|
||||
+48
-19
@@ -445,38 +445,58 @@ def do_consistency_check(self):
|
||||
self.enable_button_safe(self.btn_check_consistency)
|
||||
threading.Thread(target=task, daemon=True).start()
|
||||
def generate_batch_ui(self):
|
||||
|
||||
# PenBo 优化界面,使用customtkinter进行批量生成章节界面
|
||||
def open_batch_dialog():
|
||||
dialog = tk.Toplevel()
|
||||
dialog = ctk.CTkToplevel()
|
||||
dialog.title("批量生成章节")
|
||||
|
||||
chapter_file = os.path.join(self.filepath_var.get().strip(), "chapters")
|
||||
files = glob.glob(os.path.join(chapter_file, "chapter_*.txt"))
|
||||
if not files:
|
||||
num = 1
|
||||
else:
|
||||
num = max(int(os.path.basename(f).split('_')[1].split('.')[0]) for f in files) + 1
|
||||
dialog.geometry("+500+400")
|
||||
tk.Label(dialog, text="起始章节").grid(row=0, column=0)
|
||||
entry_start = tk.Entry(dialog)
|
||||
entry_start.grid(row=0, column=1)
|
||||
|
||||
dialog.geometry("400x200")
|
||||
dialog.resizable(False, False)
|
||||
|
||||
# 创建网格布局
|
||||
dialog.grid_columnconfigure(0, weight=0)
|
||||
dialog.grid_columnconfigure(1, weight=1)
|
||||
dialog.grid_columnconfigure(2, weight=0)
|
||||
dialog.grid_columnconfigure(3, weight=1)
|
||||
|
||||
# 起始章节
|
||||
ctk.CTkLabel(dialog, text="起始章节:").grid(row=0, column=0, padx=10, pady=10, sticky="w")
|
||||
entry_start = ctk.CTkEntry(dialog)
|
||||
entry_start.grid(row=0, column=1, padx=10, pady=10, sticky="ew")
|
||||
entry_start.insert(0, str(num))
|
||||
tk.Label(dialog, text="结束章节").grid(row=0, column=2)
|
||||
entry_end = tk.Entry(dialog)
|
||||
entry_end.grid(row=0, column=3)
|
||||
tk.Label(dialog, text="期望字数").grid(row=1, column=0)
|
||||
entry_word = tk.Entry(dialog)
|
||||
entry_word.grid(row=1, column=1)
|
||||
|
||||
# 结束章节
|
||||
ctk.CTkLabel(dialog, text="结束章节:").grid(row=0, column=2, padx=10, pady=10, sticky="w")
|
||||
entry_end = ctk.CTkEntry(dialog)
|
||||
entry_end.grid(row=0, column=3, padx=10, pady=10, sticky="ew")
|
||||
|
||||
# 期望字数
|
||||
ctk.CTkLabel(dialog, text="期望字数:").grid(row=1, column=0, padx=10, pady=10, sticky="w")
|
||||
entry_word = ctk.CTkEntry(dialog)
|
||||
entry_word.grid(row=1, column=1, padx=10, pady=10, sticky="ew")
|
||||
entry_word.insert(0, self.word_number_var.get())
|
||||
tk.Label(dialog, text="最低字数").grid(row=1, column=2)
|
||||
entry_min = tk.Entry(dialog)
|
||||
entry_min.grid(row=1, column=3)
|
||||
|
||||
# 最低字数
|
||||
ctk.CTkLabel(dialog, text="最低字数:").grid(row=1, column=2, padx=10, pady=10, sticky="w")
|
||||
entry_min = ctk.CTkEntry(dialog)
|
||||
entry_min.grid(row=1, column=3, padx=10, pady=10, sticky="ew")
|
||||
entry_min.insert(0, self.word_number_var.get())
|
||||
|
||||
auto_enrich_bool = tk.BooleanVar()
|
||||
auto_enrich_bool_ck = tk.Checkbutton(dialog, text="低于最低字数时自动扩写", variable=auto_enrich_bool)
|
||||
auto_enrich_bool_ck.grid(row=2, column=0)
|
||||
# 自动扩写选项
|
||||
auto_enrich_bool = ctk.BooleanVar()
|
||||
auto_enrich_bool_ck = ctk.CTkCheckBox(dialog, text="低于最低字数时自动扩写", variable=auto_enrich_bool)
|
||||
auto_enrich_bool_ck.grid(row=2, column=0, columnspan=2, padx=10, pady=10, sticky="w")
|
||||
|
||||
result = {"start": None, "end": None, "word": None, "min": None, "auto_enrich": None, "close": False}
|
||||
|
||||
|
||||
def on_confirm():
|
||||
nonlocal result
|
||||
if not entry_start.get() or not entry_end.get() or not entry_word.get() or not entry_min.get():
|
||||
@@ -497,7 +517,16 @@ def generate_batch_ui(self):
|
||||
nonlocal result
|
||||
result["close"] = True
|
||||
dialog.destroy()
|
||||
tk.Button(dialog, text="确认", command=on_confirm).grid(row=2, column=1)
|
||||
|
||||
# 按钮框架
|
||||
button_frame = ctk.CTkFrame(dialog)
|
||||
button_frame.grid(row=3, column=0, columnspan=4, padx=10, pady=10, sticky="ew")
|
||||
button_frame.grid_columnconfigure(0, weight=1)
|
||||
button_frame.grid_columnconfigure(1, weight=1)
|
||||
|
||||
ctk.CTkButton(button_frame, text="确认", command=on_confirm).grid(row=0, column=0, padx=10, pady=10, sticky="e")
|
||||
ctk.CTkButton(button_frame, text="取消", command=on_cancel).grid(row=0, column=1, padx=10, pady=10, sticky="w")
|
||||
|
||||
dialog.protocol("WM_DELETE_WINDOW", on_cancel)
|
||||
dialog.transient(self.master)
|
||||
dialog.grab_set()
|
||||
|
||||
@@ -88,6 +88,18 @@ class NovelGeneratorGUI:
|
||||
"retrieval_k": 4
|
||||
}
|
||||
|
||||
# PenBo 增加代理功能支持
|
||||
proxy_url = self.loaded_config["proxy_setting"]["proxy_url"]
|
||||
proxy_port = self.loaded_config["proxy_setting"]["proxy_port"]
|
||||
if self.loaded_config["proxy_setting"]["enabled"]:
|
||||
os.environ['HTTP_PROXY'] = f"http://{proxy_url}:{proxy_port}"
|
||||
os.environ['HTTPS_PROXY'] = f"http://{proxy_url}:{proxy_port}"
|
||||
else:
|
||||
os.environ.pop('HTTP_PROXY', None)
|
||||
os.environ.pop('HTTPS_PROXY', None)
|
||||
|
||||
|
||||
|
||||
# -- LLM通用参数 --
|
||||
# self.llm_conf_name = next(iter(self.loaded_config["llm_configs"]))
|
||||
self.api_key_var = ctk.StringVar(value=llm_conf.get("api_key", ""))
|
||||
|
||||
Reference in New Issue
Block a user