Compare commits

...

2 Commits

Author SHA1 Message Date
867903975f 更新功能:
段落控制功能,可自定义控制每个段落有多少句话
2025-10-17 13:56:06 +08:00
d83e82ab23 更新功能:
段落控制功能,可自定义控制每个段落有多少句话
2025-10-17 13:55:50 +08:00
2 changed files with 394 additions and 0 deletions

201
diagnose_save_failure.py Normal file
View File

@ -0,0 +1,201 @@
"""
诊断样式保存失败的具体问题
"""
import os
import traceback
from style_manager import style_manager, DocumentStyle, FontStyle, ParagraphStyle, HeadingStyle
def diagnose_save_failure():
"""诊断样式保存失败的具体问题"""
print("=== 诊断样式保存失败问题 ===")
# 1. 检查文件权限
print("\n1. 检查文件系统权限")
styles_dir = style_manager.styles_dir
print(f"样式目录: {styles_dir}")
if not os.path.exists(styles_dir):
try:
os.makedirs(styles_dir, exist_ok=True)
print("✅ 样式目录创建成功")
except Exception as e:
print(f"❌ 无法创建样式目录: {e}")
return
else:
print("✅ 样式目录已存在")
# 检查权限
readable = os.access(styles_dir, os.R_OK)
writable = os.access(styles_dir, os.W_OK)
executable = os.access(styles_dir, os.X_OK)
print(f"目录可读: {'' if readable else ''}")
print(f"目录可写: {'' if writable else ''}")
print(f"目录可执行: {'' if executable else ''}")
if not writable:
print("❌ 目录没有写入权限,这是保存失败的主要原因!")
print("解决方案:")
print("1. 以管理员身份运行程序")
print("2. 或者更改程序存储目录到用户可写的位置")
return
# 测试文件写入
test_file = os.path.join(styles_dir, "permission_test.tmp")
try:
with open(test_file, 'w', encoding='utf-8') as f:
f.write("test")
os.remove(test_file)
print("✅ 文件写入测试成功")
except Exception as e:
print(f"❌ 文件写入测试失败: {e}")
return
# 2. 检查内置样式覆盖问题
print("\n2. 检查内置样式覆盖问题")
builtin_names = list(style_manager.builtin_styles.keys())
print(f"内置样式列表: {builtin_names}")
def test_save_with_builtin_name():
"""测试使用内置样式名称保存"""
test_style = DocumentStyle(
name="爆款文章风格", # 这是内置样式名
description="测试覆盖内置样式",
body_font=FontStyle(name="微软雅黑", size=14),
body_paragraph=ParagraphStyle(line_spacing=1.5)
)
result = style_manager.create_custom_style(test_style)
if not result:
print("✅ 正确阻止了内置样式覆盖")
else:
print("❌ 错误地允许了内置样式覆盖")
test_save_with_builtin_name()
# 3. 检查样式对象结构
print("\n3. 检查样式对象结构")
def test_complete_style_object():
"""测试完整的样式对象"""
try:
# 创建完整的样式对象
complete_style = DocumentStyle(
name="结构测试样式",
description="用于测试对象结构",
body_font=FontStyle(name="微软雅黑", size=14, bold=False, italic=False, color="#000000"),
body_paragraph=ParagraphStyle(line_spacing=1.5, space_before=0, space_after=0, first_line_indent=0.0)
)
# 添加标题样式
complete_style.heading_styles = {}
for level in range(1, 4):
complete_style.heading_styles[level] = HeadingStyle(
font=FontStyle(name="微软雅黑", size=18-level*2, bold=True, color="#1F497D"),
paragraph=ParagraphStyle(line_spacing=1.3, space_before=12, space_after=6),
outline_level=level
)
print("✅ 样式对象结构创建成功")
# 测试序列化
from dataclasses import asdict
import json
style_dict = asdict(complete_style)
json_str = json.dumps(style_dict, ensure_ascii=False, indent=2)
print("✅ 样式对象序列化成功")
# 测试保存
save_result = style_manager.create_custom_style(complete_style)
if save_result:
print("✅ 完整样式对象保存成功")
return True
else:
print("❌ 完整样式对象保存失败")
return False
except Exception as e:
print(f"❌ 样式对象结构测试失败: {e}")
traceback.print_exc()
return False
structure_test_result = test_complete_style_object()
# 4. 检查不完整的样式对象
print("\n4. 检查不完整样式对象的处理")
def test_incomplete_style_object():
"""测试不完整的样式对象"""
try:
# 创建不完整的样式对象(缺少必要字段)
incomplete_style = DocumentStyle(
name="不完整测试样式",
description="用于测试不完整对象"
# 故意不设置 body_font 和 body_paragraph
)
print(f"body_font是否为None: {incomplete_style.body_font is None}")
print(f"body_paragraph是否为None: {incomplete_style.body_paragraph is None}")
# 由于__post_init__方法这些应该被自动初始化
if incomplete_style.body_font and incomplete_style.body_paragraph:
print("✅ 不完整样式对象已自动补全")
save_result = style_manager.create_custom_style(incomplete_style)
if save_result:
print("✅ 补全后的样式对象保存成功")
return True
else:
print("❌ 补全后的样式对象保存失败")
return False
else:
print("❌ 样式对象自动补全失败")
return False
except Exception as e:
print(f"❌ 不完整样式对象测试失败: {e}")
traceback.print_exc()
return False
incomplete_test_result = test_incomplete_style_object()
# 5. 总结和建议
print("\n=== 诊断结果总结 ===")
if structure_test_result and incomplete_test_result:
print("✅ 样式对象结构正常")
print("✅ 文件权限正常")
print("✅ 内置样式保护正常")
print("\n可能的问题和解决方案:")
print("1. 确保样式名称不与内置样式重复")
print("2. 检查是否在高级编辑器中输入了有效的样式名称")
print("3. 确保修改后调用了正确的保存方法")
else:
print("❌ 发现问题,需要进一步修复")
if not structure_test_result:
print("- 样式对象结构存在问题")
if not incomplete_test_result:
print("- 样式对象自动补全机制存在问题")
def provide_save_tips():
"""提供保存操作的使用提示"""
print("\n=== 正确的保存操作步骤 ===")
print("1. 在高级编辑器中修改样式")
print("2. 确保填写了样式名称(不能为空)")
print("3. 确保样式名称不与内置样式重复")
print("4. 点击'保存样式''另存为'按钮")
print("5. 查看是否有错误提示对话框")
print("\n内置样式列表(不能覆盖):")
for i, name in enumerate(style_manager.builtin_styles.keys(), 1):
print(f" {i}. {name}")
print("\n如果仍然保存失败,请:")
print("1. 检查控制台输出的详细错误信息")
print("2. 确认程序有写入权限")
print("3. 尝试使用不同的样式名称")
if __name__ == '__main__':
diagnose_save_failure()
provide_save_tips()

193
style_save_guide.py Normal file
View File

@ -0,0 +1,193 @@
"""
样式保存问题解决指南
"""
import tkinter as tk
from tkinter import ttk, messagebox
from style_manager import style_manager
def show_save_guide():
"""显示样式保存指南"""
guide_window = tk.Toplevel()
guide_window.title("样式保存问题解决指南")
guide_window.geometry("600x500")
guide_window.resizable(True, True)
# 创建滚动文本区域
text_frame = ttk.Frame(guide_window)
text_frame.pack(fill='both', expand=True, padx=10, pady=10)
# 滚动条
scrollbar = ttk.Scrollbar(text_frame, orient="vertical")
scrollbar.pack(side="right", fill="y")
# 文本区域
text_widget = tk.Text(text_frame, wrap=tk.WORD, yscrollcommand=scrollbar.set,
font=("Microsoft YaHei", 10), padx=10, pady=10)
text_widget.pack(side="left", fill="both", expand=True)
scrollbar.config(command=text_widget.yview)
# 指南内容
guide_content = """
📋 样式保存问题解决指南
如果您遇到"保存样式失败"的错误请按照以下步骤排查和解决
🔍 问题诊断
1. 错误信息解读
"不能覆盖内置样式" - 您使用了系统预设的样式名称
"文件权限问题" - 程序无法写入文件到磁盘
"样式对象结构错误" - 内部数据结构异常
2. 内置样式列表不能覆盖
爆款文章风格
微信公众号风格
知乎高赞回答风格
小红书笔记风格
今日头条新闻风格
B站UP主视频脚本风格
企业微信群通知风格
情感鸡汤文风格
解决方案
样式名称问题
1. 确保样式名称不为空
2. 不要使用上述内置样式名称
3. 建议使用描述性名称"我的自定义样式""公司报告样式"
4. 如果要修改内置样式请使用"另存为"功能
文件权限问题
1. 以管理员身份运行程序
2. 检查程序目录是否有写入权限
3. 确保磁盘空间充足
4. 临时关闭杀毒软件的实时保护
系统问题
1. 重启程序再次尝试
2. 检查是否有其他程序占用文件
3. 更新到最新版本程序
🛠 正确的操作步骤
保存样式
1. 在高级编辑器中修改样式设置
2. "基本信息"选项卡中输入样式名称
3. 确保名称不与内置样式重复
4. 点击"保存样式"按钮
5. 等待确认消息
另存为新样式
1. 在高级编辑器中修改样式设置
2. 点击"另存为"按钮
3. 在弹出对话框中输入新名称
4. 确保名称不重复
5. 点击确定完成保存
📞 获取帮助
如果问题仍然存在
1. 查看控制台输出的详细错误信息
2. 检查是否有特殊字符在样式名称中
3. 尝试使用简单的英文名称测试
4. 记录具体的错误步骤和错误信息
💡 最佳实践
1. 样式命名规范
使用有意义的描述性名称
避免特殊字符和空格
建议格式项目_用途_版本"报告_标准_v1"
2. 定期备份
重要样式请导出保存
定期备份样式文件夹
3. 测试流程
先用简单名称测试保存功能
确认无误后再使用复杂样式
修改重要样式前先备份
🔧 技术信息
样式文件位置data/styles/
支持的操作创建修改删除导入导出
文件格式JSON格式
编码UTF-8
如果您按照此指南操作仍有问题说明可能存在程序bug
请联系技术支持并提供详细的错误信息
"""
text_widget.insert("1.0", guide_content)
text_widget.config(state='disabled')
# 底部按钮
button_frame = ttk.Frame(guide_window)
button_frame.pack(fill='x', padx=10, pady=10)
def check_current_styles():
"""检查当前样式状态"""
styles = style_manager.get_style_names()
builtin_count = len(style_manager.builtin_styles)
custom_count = len(style_manager.custom_styles)
info = f"当前样式统计:\n\n"
info += f"内置样式:{builtin_count}\n"
info += f"自定义样式:{custom_count}\n"
info += f"总计:{len(styles)}\n\n"
info += "自定义样式列表:\n"
custom_names = list(style_manager.custom_styles.keys())
if custom_names:
for name in custom_names:
info += f"{name}\n"
else:
info += " (暂无自定义样式)"
messagebox.showinfo("样式状态", info)
def test_save_permission():
"""测试保存权限"""
import os
import tempfile
try:
styles_dir = style_manager.styles_dir
test_file = os.path.join(styles_dir, "permission_test.tmp")
# 测试写入
with open(test_file, 'w', encoding='utf-8') as f:
f.write("permission test")
# 测试读取
with open(test_file, 'r', encoding='utf-8') as f:
content = f.read()
# 清理
os.remove(test_file)
messagebox.showinfo("权限测试", "✅ 文件权限正常\n\n程序可以正常读写样式文件。")
except Exception as e:
error_msg = f"❌ 文件权限异常\n\n错误详情:{str(e)}\n\n"
error_msg += "建议解决方案:\n"
error_msg += "• 以管理员身份运行程序\n"
error_msg += "• 检查磁盘空间是否充足\n"
error_msg += "• 确认杀毒软件未阻止文件操作"
messagebox.showerror("权限测试失败", error_msg)
ttk.Button(button_frame, text="检查当前样式", command=check_current_styles).pack(side='left', padx=5)
ttk.Button(button_frame, text="测试保存权限", command=test_save_permission).pack(side='left', padx=5)
ttk.Button(button_frame, text="关闭", command=guide_window.destroy).pack(side='right', padx=5)
def main():
"""主函数 - 独立运行指南"""
root = tk.Tk()
root.withdraw() # 隐藏主窗口
show_save_guide()
root.mainloop()
if __name__ == '__main__':
main()